stack 数据结构
栈定义
栈:后进先出(永远从栈顶取元素)LIFO last-in-first-out
栈只允许操作栈顶的元素(也就是数组的最后一个元素)
栈实现
class Stack { static items = [] push(item) { Stack.items.push(item) } pop() { return Stack.items.pop() } top() { return Stack.items[Stack.items.length - 1] } isEmpty() { return Stack.items.length === 0 } size() { return Stack.items.length } clear() { Stack.items.length = 0 } }
最小栈
最小栈 除了普通栈的几个方法之外,还提供了min方法返回栈中最小元素,时间复杂度是O(1)
栈的例子
判断回文数
/** * 判断是否是回文数 * @param {string} str * @returns{boolean} */ function isPalindRome(str) { const arr = [] //用数组来模拟栈结构 let str1 = '' //逆序str for (const char of str) { arr.push(char) //入栈操作 } while (arr.length > 0) { str1 += arr.pop() // 出栈操作 arr改变 } return str === str1 }
判断括号是否成对存在
// 遍历字符串每个字符,遇到左括号push栈中;遇到右括号判断:如果栈为空,说明缺少左边括号。不合法;反之。pop出栈(左右括号抵消)
// 遍历结束之后,看栈中是否还有左括号,如果有说明左括号没有完全抵消掉,不合法。反之合法
function is_leagl_brackets(str) { const s = new Stack(); for (let i = 0; i < str.length; i++) { let char = str[i] if (char === '(') { s.push(char) continue } if (char === ')') { if (s.isEmpty()) return false //如果栈为空,说明栈里面没左括号 s.pop() //如果存在左括号,移除栈顶元素 } } // 循环一次结束之后,看栈中是否还存在左边括号,如果存在,说明没有抵消完 if (s.isEmpty()) return true //栈为空,左右括号全部抵消完 return false //反之 多了左括号 } const str = '355)(a(bc(ds(ew)rw)re)aeef' //不合法(这个解释了查左右括号个数是否相等思路是错的) const str1 = '355(a(bc(ds(ew)rw)re)aeef' //不合法 左右括号不等 const str2 = '355(a(bc(ds(ew)rw)re)ae)ef' //合法