JavaScript 使用数组实现堆栈
在本节中,我们将学习使用JavaScript数组实现堆栈的方法。
什么是堆栈
堆栈是一种数据结构,其中我们按照后进先出(LIFO)的原则放置元素。后进先出的原则意味着元素的排列方式是最近添加的元素最先被移除,最初添加的元素最后被移除。可以将堆栈中元素的排列理解为摆放盘子的方式,最先放置的盘子最后使用。这种排列方式称为LIFO。
堆栈包含两个主要函数,它们分别是 push() 和 pop() 。堆栈的这两个操作都发生在堆栈顶部。push()操作用于向堆栈中插入/添加元素,而pop()函数则用于从堆栈中移除/弹出元素。push()和pop()操作发生在顶部,因为在堆栈中,元素总是从顶部推入和弹出。
堆栈的操作
以下是对堆栈执行的操作:
- push() : push()操作用于向堆栈中添加元素。
- pop() : pop()操作用于从堆栈中移除元素。
- peek() : peek()操作用于获取堆栈中的顶部元素。
- length() : length()操作用于返回堆栈的长度。
- search() : search()操作用于搜索元素是否存在于堆栈中。
- print() : print()操作用于打印堆栈的元素。
- isEmpty() : isEmpty()操作用于检查堆栈是否为空。
现在,我们将讨论堆栈及其方法(上面已讨论)的实现。
实现堆栈及其操作
为了实现堆栈数据结构,我们需要创建一个如下所示的堆栈类:
class stck {
constructor () {
this.ele = [];
this.top = 0;
}
}
在上面的代码中:
- 我们创建了一个叫做stck的类。
- 在其中,我们创建了一个构造函数,它使用了两个属性,即ele和top。ele是用来向栈中添加元素的数组元素,而我们知道在栈中,元素是从栈顶添加的。所以,我们创建了一个top变量,它指向栈顶元素所在的索引。
- 两个属性都是通过 this 获取到的。this关键字用于获取当前的值。
push()操作
将元素添加到栈顶位置的一种栈方法。
下面是一个使用push()方法的示例:
stackpush (e) {
this.ele[this.top] = e;
this.top = this.top + 1;
}
在上面的代码中:
- 我们创建了一个名为stackpush()的函数,其中我们传递了一个参数e。参数e将包含要插入堆栈的值。
- 在函数下方,使用 this 我们访问了e的值,将其赋值给ele数组和top。
- 现在,top的值增加了1,因为top变量必须指向堆栈中下一个空的数组索引。
pop()操作
Stack的pop()方法用于从堆栈的顶部位置删除元素。
下面是一个stackpop()操作的示例:
stackpop () {
this.top = this.top - 1;
return this.data.pop ();
}
在上面的代码中:
- 我们创建了一个stackpop()函数,在这个函数中,第一步是将top的值减1。这是因为top变量需要指向前一个元素的位置。
- 在下一步中,使用这个操作符将位于Stack顶部的值弹出。
length()操作
Stack的length()操作用于使用top变量返回Stack的长度。
下面是使用length()操作的一个示例:
stacklength () {
return this.top;
}
在上述代码中,我们创建了一个stacklength()函数,它将从栈顶计算并返回长度。
peek()操作
用于获取栈顶元素的栈操作。
下面是一个示例,用于理解peek()函数的实际实现:
peek() {
return this.data[this.top -1 ];
}
- 在上面的代码中,peek()函数返回堆栈顶部的元素。
- 我们使用top – 1作为顶部变量,它指向堆栈中添加元素的顶部位置。
print()操作
print()操作用于打印堆栈中存在的元素。因此,它类似于C编程中的printf。
以下是一个示例,展示了print()操作的实现:
function print() {
var t = this.top - 1; // as top variable points to the element position
while(t >= 0) {
console.log(this.data[t]);
t--;
}
}
在上述代码中:
- 我们创建了一个print()函数,在该函数中,我们初始化一个名为t的变量,值为top-1。
- 接下来,我们使用while循环来打印栈中所有的值,从栈顶开始。
- 循环会从最后一个元素打印到栈顶即0 th
- 每个数组索引上的值将按照索引值打印出来。
- 最后,值会递减,即t–。
reverse()操作
reverse()操作用于颠倒栈的顺序,使得栈中的值以反向顺序打印出来。
下面是一个示例,说明了reverse()函数的实现:
function reverse() {
this.rev(this.top - 1 );
}
function _rev(index) {
if(index != 0) {
this.rev(index-1);
}
console.log(this.data[index]);
}
在上面的代码中:
- 我们使用递归创建了一个reverse()函数。
- 在此之后,创建了另一个函数rev(),其参数是索引。
- 在rev()函数下面,我们使用了if语句,如果索引值不相等,则计算反转堆栈元素。
- 最后,将打印反转的堆栈元素。
- 这些是我们已经实际实现的一些堆栈方法。
组合代码实现
让我们看一个具有不同操作的堆栈的完整实现。实现的示例如下:
class stck {
constructor(){
this.data = [];
this.top = 0;
}
stackpush(element) {
this.data[this.top] = element;
this.top = this.top + 1;
}
stacklength() {
return this.top;
}
peek() {
return this.data[this.top-1];
}
isEmpty() {
return this.top == 0;
}
stackpop() {
if( this.isEmpty() == false ) {
this.top = this.top -1;
return this.data.pop(); // last element gets deleted
}
}
print() {
var t = this.top - 1;
while(t >= 0) {
console.log(this.data[top]);
t--;
}
}
reverse() {
this.rev (this.top - 1 );
}
rev(index) {
if(index != 0) {
this.rev(index-1);
}
console.log(this.data[index]);
}
}
你可以实现上面的代码并进行实际理解。