栈的数据结构
感谢阅读~
栈是一种遵从后进先出(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种方法创建了栈!
扫描二维码
关注更多精彩