292 阅读1分钟
  • 栈是一种遵循==后进先出(LIFO)==原则的有序集合,新添加或待删除的元素都保存在栈的同一端,称作栈顶。另一端就叫栈底。在栈里,新元素靠近栈定,旧元素靠近栈底。
  • 栈也被用在编程语言的编译器和内存中保存变量和方法调用等,也被用于浏览器记录等。

1. 基于JavaScript数组创建栈结构

  • 缺点:在使用数组时,大部分的方法时间复杂度都是O(n),如果数组有更多元素,那所需的时间就会更长,另外,数组是元素的一个有序集合,为了保证元素有序,它会占用更多的空间。
class Stack {
  constructor() {
    this.stack = [];
  }
  //添加一个(或几个)新元素到栈顶
  push(elements) {
    this.stack.push(elements);
  }
  //移除栈顶的元素,同时返回被移除的元素
  pop() {
    return this.stack.pop();
  }
  //返回栈顶的元素
  peek() {
    return this.stack[this.stack.length - 1];
  }
  //返回栈是否为空
  isEmpty() {
    return this.stack.length === 0;
  }
  //返回栈元素的个数
  size() {
    return this.stack.length;
  }
  //返回这个栈
  toArray() {
    return this.stack;
  }
  //将栈转化为字符串
  toString() {
    return this.stack.toString();
  }
}

2. 基于JavaScript对象的栈结构

class Stack {
  constructor() {
    this.stack = {};
    this.count = 0;
  }
  //添加一个新元素到栈顶
  push(element) {
    this.stack[this.count] = element;
    this.count++;
  }
  //移除栈顶的元素,同时返回被移除的元素
  pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const res = this.stack[this.count];
    delete this.stack[this.count];
    return res;
  }
  //返回栈顶的元素
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.stack[this.count];
  }
  //返回栈是否为空
  isEmpty() {
    return this.count === 0;
  }
  //返回栈元素的个数
  size() {
    return this.count;
  }
  //返回这个栈
  toArray() {
    return this.stack;
  }
  //清空栈结构
  clear() {
    this.stack = {};
    this.count = 0;
  }
  //将栈转化为字符串
  toString() {
    if (this.isEmpty()) {
      return '';
    }
    let stackString = `${this.stack[0]}`;
    for (let i = 1; i < this.count;i++) {
      stackString = `${stackString},${this.stack[i]}`;
    }
    return stackString;
  }
}