JS实现栈类

956 阅读4分钟
栈的数据结构

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

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

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

栈的方法

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种方法创建了栈!

感谢阅读~

扫描二维码

关注更多精彩