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