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
  }


}
View Code

最小栈

最小栈 除了普通栈的几个方法之外,还提供了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' //合法 
View Code

 

posted on 2020-07-27 16:29  章画  阅读(234)  评论(0编辑  收藏  举报

导航