关于计算机科学中的栈(Stack)结构

127 阅读2分钟

栈(Stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表(LIFO)。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。

通俗去讲就是比如我们洗好的盘子,需要垒叠放置在一起,最后洗好的盘子,放在了最顶,最先洗好的放在了最底层,那么我们的计算机科学中的 也正是如此。最先进入栈的我们叫做 入栈 或者叫做 进栈压栈, 先进入的在 栈底,最后进入的在 栈顶

同理我们拿盘子去用的时候也是拿的最后放进去的,也就是拿的是最后入栈存在于 栈顶 的,这无法和我们常见的数组一样,可以随意在数组中的任意位置放置拿取。

image.png

在我们JavaScript中常见的栈的操作

  1. push(element): 添加一个新元素到栈顶位置
  2. pop(): 移除栈顶的元素,同时返回被移除的元素
  3. peek(): 返回栈顶的元素,不对栈做任何修改( 这个方法不会移除栈顶的元素,仅仅返回它 )。
  4. isEmpty(): 如果栈里没有任何元素就返回true,否则返回false。
  5. size() : 返回栈里的元素个数。这个方法和数组的length属性很类似。
  6. toString():将栈结构的内容以字符形式返回
  //封装栈类
    function Stack(){
        //栈中的属性
        this.items = []

        //栈的相关操作
        
        // 1.将元素压入栈
        Stack.prototype.push = function (element){
            this.items.push(element)
        }

        // 2.从栈中取出元素
        Stack.prototype.pop = function (){
            return this.items.pop()
        }

        // 3.查看一下栈顶元素
        Stack.prototype.peek = function (){
            return this.items[this.items.length - 1]
        }

        // 4.判断栈是否为空
        Stack.prototype.isEmpty = function(){
            return this.items.length === 0
        }

        // 5.获取栈中元素的个数
        Stack.prototype.size = function (){
            return this.items.length
        }

        // 6.toString 方法
        Stack.prototype.toString = function (){
            let resultString = ''
            for(let i = 0 ; i < this.items.length; i++){
                resultString += this.items[i] + ' '
            }
            return resultString
        }
    }

    let s = new Stack()
    s.push(20)
    s.push(10)
    s.push(40)
    s.push(70)
    alert(s)
    s.pop()
    s.pop()
    s.pop()
    alert(s.peek())
    alert(s.isEmpty())
    alert(s.size())
    alert(s.toString())