Stack的特点是后进先出(last in first out)。生活中常见的Stack的例子比如一摞书,你最后放上去的那本你之后会最先拿走;又比如浏览器的访问历史,当点击返回按钮,最后访问的网站最先从历史记录中弹出。

  1. Stack一般具备以下方法:
  2. push:将一个元素推入栈顶
  3. pop:移除栈顶元素,并返回被移除的元素
  4. peek:返回栈顶元素
  5. length:返回栈中元素的个数

使用数组

class Stack {
  constructor() {
    this.items = [];
  }
 
  /**
   * 添加一个(或几个)新元素到栈顶
   * @param {*} element 新元素
   */
  push(element) {
    this.items.push(element)
  }
 
  /**
   * 移除栈顶的元素,同时返回被移除的元素
   */
  pop() {
    return this.items.pop()
  }
 
  /**
   * 返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
   */
  peek() {
    return this.items[this.items.length - 1]
  }
 
  /**
   * 如果栈里没有任何元素就返回true,否则返回false
   */
  isEmpty() {
    return this.items.length === 0
  }
 
  /**
   * 移除栈里的所有元素
   */
  clear() {
    this.items = []
  }
 
  /**
   * 返回栈里的元素个数。这个方法和数组的length属性很类似
   */
  size() {
    return this.items.length
  }
}

手动实现

Javascript的Array天生具备了Stack的特性,但我们也可以从头实现一个 Stack类:

function Stack() { 
  this.count = 0
  this.storage = {}; 
 
  this.push = function (value) { 
    this.storage[this.count] = value; 
    this.count++
  } 
 
  this.pop = function () { 
    if (this.count === 0) { 
      return undefined
    } 
    this.count--
    var result = this.storage[this.count]; 
    delete this.storage[this.count]; 
    return result; 
  } 
 
  this.peek = function () { 
    return this.storage[this.count - 1]; 
  } 
 
  this.size = function () { 
    return this.count; 
  }