JS实现栈类

栈的数据结构

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

在现实生活中也能发现很多栈的例子。例如,下图里的一摞书或者餐厅里堆放的盘子。

5335e031edaf897b83e3f1aa65b32b4a.png

栈也被用在编程语言的编译器和内存中保存变量、方法调用等。

栈的方法

push(element):添加新元素到栈顶。

pop():移除栈顶的元素,同时返回被移除的元素。

peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。

isEmpty():如果栈里没有任何元素就返回true,否则返回false。 

clear():移除栈里的所有元素。

size():返回栈里的元素个数。这个方法和数组的length属性很类似。

创建一个基于数组的栈类

创建一个基于数组的栈类,先从声明Stack类开始。

class StackArray {
  constructor() {
    this.items = [];//用数组保存栈元素
  }
}

数组允许我们在任何位置添加或删除元素,由于栈遵循LIFO的原则,需要对元素的插入和删除功能进行限制,接下来实现栈的方法。

class StackArray {
  constructor() {
    this.items = [];//用数组保存栈元素
  }
  //向栈添加元素
  push(element) {
    this.items.push(element);
  }
  //从栈移除元素
  pop() {
    return this.items.pop();
  }
  //查看栈顶元素
  peek() {
    return this.items[this.items.length - 1];
  }
  //检查栈是否为空
  isEmpty() {
    return this.items.length === 0;
  }
  //查看栈的长度
  size() {
    return this.items.length;
  }
  //清空栈元素
  clear() {
    this.items = [];
  }
  //栈转化为数组
  toArray() {
    return this.items;
  }
  //栈转化为字符串
  toString() {
    return this.items.toString();
  }
}

创建一个基于对象的Stack类

在使用数组创建Stack类时,大部分方法的时间复杂度O(n)。我们也可以使用一个对象来存储所有的栈元素,保证它们的顺序并且遵循LIFO原则。相较数组实现方式性能更好。接下来创建一个基于JavaScript对象的Stack类。

首先声明一个Stack类。我们需要使用一个count属性来帮助我们记录栈的大小(也能帮助我们向栈中添加和删除元素)。

class Stack {
  constructor() {
    this.count = 0;
    this.items = {};
  }
}

接下来实现栈的方法。

class Stack {
  constructor() {
    this.count = 0;
    this.items = {};
  }
  /* 
  基于数组的版本中,我们可以同时向Stack类中添加多个元素,由于使用了对象,这个版本只允许我们一次插入一个元素。
  向栈中添加元素,我们将使用count变量作为items对象的键名,插入的对象是它的值。插入元素后,递增count变量。
  */
  push(element) {
    this.items[this.count] = element;
    this.count++;
  }

  pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }

  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count - 1];
  }

  isEmpty() {
    return this.count === 0;
  }

  size() {
    return this.count;
  }
  /*
  清空栈只需要将它的值复原为构造函数中的值即可,
  也可以遵循LIFO的规则,使用pop方法来移除栈中所有的元素。
  */
  clear() {
    /* while (!this.isEmpty()) {
        this.pop();
      } */
    this.items = {};
    this.count = 0;
  }

  toString() {
    if (this.isEmpty()) {
      return '';
    }
    let objString = `${this.items[0]}`;
    for (let i = 1; i < this.count; i++) {
      objString = `${objString},${this.items[i]}`;
    }
    return objString;
  }
}

这样,我们就用2种方法创建了栈!

c31c85b572ca27c616c56e9f2db98d45.gif感谢阅读~

4a93dee694df76f43d1394045ad00878.png

59db734e0b062e2b3d9439fc62cf6d8b.jpeg

扫描二维码

关注更多精彩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值