📲

02栈

一、栈理论知识

  • 数组
    • 我们知道数组是一种线性结构, 并且可以在数组的任意位置插入和删除数据.
    • 但是有时候, 我们为了实现某些功能, 必须对这种任意性加以限制.
    • 而栈和队列就是比较常见的受限的线性结构, 我们先来学习栈结构.
  • 栈(stack),它是一种运算受限的线性表,后进先出(LIFO)
    • LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘, 往往先把拿出去使用.
    • 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
    • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
    • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
notion image
程序中什么是使用栈实现的呢?
  • 学了这么久的编程, 是否听说过, 函数调用栈呢?
  • 我们知道函数之间和相互调用: A调用B, B中又调用C, C中又调用D.
  • 那样在执行的过程中, 会先将A压入栈, A没有执行完, 所有不会弹出栈.
  • 在A执行的过程中调用了B, 会将B压入到栈, 这个时候B在栈顶, A在栈底.
  • 如果这个时候B可以执行完, 那么B会弹出栈. 但是B有执行完吗? 没有, 它调用了C.
  • 所以C会压栈, 并且在栈顶. 而C调用了D, D会压入到栈顶.
  • 所以当前的栈顺序是: 栈顶A->B->C->D栈顶
  • D执行完, 弹出栈. C/B/A依次弹出栈.
  • 所以我们有函数调用栈的称呼, 就来自于它们内部的实现机制. (通过栈来实现的)

二、栈方法

栈常见有哪些操作呢?
  • push(element): 添加一个新元素到栈顶位置.
  • pop():移除栈顶的元素,同时返回被移除的元素。
  • peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false
  • clear():移除栈里的所有元素。
  • size():返回栈里的元素个数。这个方法和数组的length属性很类似。