数据结构-栈

72 阅读2分钟

“栈” 是一种数据结构,遵循 "后进先出" 原则,可以想象为可比克桶装薯片,拿的时候只能拿最上层的薯片。

栈结构要满足以下的特性:
  1. 后进先出: 最后进入栈的元素首先被取出
  2. 有限大小: 有固定大小的容量 或者可以动态扩展容量,不可能无限增长
  3. 只能在栈顶做增删操作: 新增和删除都是在栈顶位置
  4. 高效操作:入栈push 和出栈pop 在O(1)时间完成,时间复杂度为常数
栈的主要功能有:
  1. 压栈(Push) :向栈顶插入一个元素。新元素成为栈顶元素。
  2. 出栈(Pop) :移除栈顶元素,并返回被移除的元素。
  3. 查看栈顶元素:返回栈顶元素,但不移除它。
  4. 检查栈是否为空:判断栈是否为空。如果栈中没有元素,则返回真(True),否则返回假(False)。
  5. 获取栈的大小:返回栈中元素的数量。
  6. 清空栈:移除栈中的所有元素,使其变为空栈。
  7. 其他操作:根据需要,还可以实现如反转栈、复制栈、搜索栈等操作。
栈在计算机科学中有广泛的应用,例如:
  • 表达式求值:使用栈来处理逆波兰表达式。
  • 后退功能:在浏览器中使用栈来存储历史记录。
  • 函数调用:在编程语言中,使用栈来存储函数调用信息,如局部变量、返回地址等。
  • 算法实现:如深度优先搜索(DFS)、逆序打印链表等。
  • 程序调用的上下文切换:操作系统使用栈来保存和恢复程序执行的状态。
用js实现栈结构:
    // 栈
        class Stack {
            constructor() {
                this.stack = []
            }
            // 入栈
            push(item) {
                this.stack.push(item)
            }
            // 出栈
            pop() {
                if (this.isEmpty()) {
                    return undefined
                } else {
                    return this.stack.pop()
                }
            }
            // 查看栈顶
            peek() {
                if (this.isEmpty()) {
                    return undefined
                } else {
                    return this.stack[this.stack.length - 1]
                }
            }

            // 判断栈是否为空
            isEmpty() {
                return this.stack.length === 0
            }

            //清空栈
            clear() {
                this.stack = []
            }
            size() {
                return this.stack.length
            }
        }

        const myStack = new Stack()
        myStack.push(1)
        myStack.push(2)
        myStack.push(3)
        myStack.push(4)
        console.log(myStack.size())//4
        console.log(myStack.peek())//4
        console.log(myStack.pop())//4
        console.log(myStack.peek())//3
        console.log(myStack.isEmpty())//false
        console.log(myStack.size())//3
        myStack.clear()
        console.log(myStack.size())//0