数据结构-栈

148 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

介绍

相信很多人对 这个数据结构并不陌生,是数据结构的基本知识,里面也有很多小的知识点,这里也简单总结一下。

的示意图:

image.png

简介

先进后出, 后进先出 的一种方式,例如生活中有很多的例子: 叠盘子,压羽毛球桶,进狭窄的电梯 等等,都是 先进后出 的应用。

只能在栈顶 来进行 插入 或 删除 的操作。

(Stack) 的操作方式有:

  • 进栈(push)

    将一个元素添加到栈顶

  • 出栈(pop)

    将栈顶元素移除

  • 返回栈顶(peek)

    返回栈顶的元素,但不移除

  • 栈是否为空(isEmpty)

    判断栈里是否为空

  • 栈中元素数量(size)

    返回 栈 里面元素的数量

  • 清空(clear)

    清空栈内所有的元素

代码

    class Stack {
      constructor() {
        this.arr = [10, 2, 3, 4, 6]
      }

      push(element) {
        this.arr.push(element)
      }

      pop() {
        return this.arr.pop()
      }
      peek() {
        return this.arr[this.arr.length - 1]
      }

      isEmpty() {
        return this.arr.length == 0
      }

      size() {
        return this.arr.length
      }

      clear() {
        this.arr = []
      }
    }

    const stack = new Stack()

    stack.push(12)
    console.log(stack.arr)
    console.log(stack.pop())
    console.log(stack.arr)
    console.log(stack.peek())
    console.log(stack.arr)
    console.log(stack.isEmpty())
    console.log(stack.arr)
    console.log(stack.size())
    console.log(stack.arr)
    stack.clear()
    console.log(stack.arr)

得到的结果为:

    [ 10, 2, 3, 4, 6, 12 ]
    12
    [ 10, 2, 3, 4, 6 ]
    6
    [ 10, 2, 3, 4, 6 ]
    false
    [ 10, 2, 3, 4, 6 ]
    5
    [ 10, 2, 3, 4, 6 ]
    []

例子

经典的 栈 来解决的 例子

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

输入: s = "()"
输出: true

结果代码

    class Stack {
      constructor() {
        this.arr = []
      }

      push(element) {
        this.arr.push(element)
      }

      pop() {
        return this.arr.pop()
      }
      peek() {
        return this.arr[this.arr.length - 1]
      }

      isEmpty() {
        return this.arr.length == 0
      }

      size() {
        return this.arr.length
      }

      clear() {
        this.arr = []
      }
    }
    
    const isValid = (s) => {
      const stack = new Stack()
      let symbolStr

      for (let i in s) {
        // console.log(s[i])
        switch (s[i]) {
          case '(':
            stack.push(s[i])
            break
          case '[':
            stack.push(s[i])
            break
          case '{':
            stack.push(s[i])
            break
          case ')':
            symbolStr = stack.pop()
            if (symbolStr !== '(') return false
            break
          case ']':
            symbolStr = stack.pop()
            if (symbolStr !== '[') return false
            break
          case '}':
            symbolStr = stack.pop()
            if (symbolStr !== '{') return false
            break
        }
      }
      // 循环完毕后,判断 stack 里面是否还有数据
      return stack.size() === 0 ? true : false
    }

总结

是数据结构的基础,它的方式是 先进后出 。

且只能在 栈顶 进行 添加或删除操作。