在本文中,我们将使用Javascript实现堆栈数据结构。堆栈是非常有用的数据结构,具有广泛的应用范围。堆栈是一种线性数据结构,其中元素的添加或删除遵循特定顺序,即LIFO(后进先出)和FILO(后进先出)。
注意:假设堆栈可以动态增长,我们不考虑溢出情况。
让我们看一下使用Java脚本中的数组的堆栈类的示例:-
例子:
// Stack class
class Stack {
// Array is used to implement stack
constructor()
{
this.items = [];
}
// Functions to be implemented
// push(item)
// pop()
// peek()
// isEmpty()
// printStack()
}
如您所见,上面的定义创建了一个堆栈类的框架,其中包含一个构造函数,在该构造函数中我们声明了一个实现堆栈的数组。因此,随着堆栈类对象的创建,该构造函数将被自动调用。
现在让我们看一下每种方法的实现:
- 推送:将元素添加到堆栈中
// push function push(element) { // push element into the items this.items.push(element); }
此方法在堆栈顶部添加一个元素。
- Pop():从堆栈中删除一个元素,如果在空堆栈上调用该函数,则表示“下溢”
// pop function pop() { // return top most element in the stack // and removes it from the stack // Underflow if stack is empty if (this.items.length == 0) return "Underflow"; return this.items.pop(); }
此方法返回堆栈的最上层元素并将其删除。在空堆栈上调用时返回下溢。
- Peek():返回堆栈中最上面的元素,但不删除它。
// peek function peek() { // return the top most element from the stack // but does'nt delete it. return this.items[this.items.length - 1]; }
返回最上面的元素而不将其从堆栈中删除。
辅助方法
这是Stack执行的三个基本操作,我们可以声明一些帮助程序方法,这些方法在使用Stack时很有用。
- isEmpty():如果堆栈为空,则返回true
// isEmpty function isEmpty() { // return true if stack is empty return this.items.length == 0; }
如果堆栈为空,则返回true。
- printStack():此方法返回一个字符串,该字符串中堆叠了堆栈的所有元素。
// printStack function printStack() { var str = ""; for (var i = 0; i < this.items.length; i++) str += this.items[i] + " "; return str; }
注意:根据需要,可以在Stack类中声明不同的helper函数。现在,完成定义堆栈类的操作后,就可以使用它了。
样例功能
在此示例中,我们将创建一个堆栈类的对象并测试它的一些功能。
// creating object for stack class
var stack = new Stack();
// testing isEmpty and pop on an empty stack
// returns false
console.log(stack.isEmpty());
// returns Underflow
console.log(stack.pop());
堆栈类的其他一些功能
例子 :
// Adding element to the stack
stack.push(10);
stack.push(20);
stack.push(30);
// Printing the stack element
// prints [10, 20, 30]
console.log(stack.printStack());
// returns 30
console.log(stack.peek());
// returns 30 and remove it from stack
console.log(stack.pop());
// returns [10, 20]
console.log(stack.printStack());
一旦我们完成了堆栈类的实现和测试,现在就可以在不同的应用程序中使用它了。
应用程序:后缀表达的评估
在此示例中,我们将使用上面的堆栈类来评估后缀表达式
// Performs Postfix Evaluation on a given exp
function postFixEvaluation(exp)
{
var stack = new Stack();
for (var i = 0; i < exp.length; i++) {
var c = exp[i];
if (!isNaN(c))
stack.push(c - '0');
else {
var val1 = stack.pop();
var val2 = stack.pop();
if (val1 == "Underflow" || val2 == "Underflow")
return "Can't perform postfix evaluation";
switch (c) {
case '+':
stack.push(val2 + val1);
break;
case '-':
stack.push(val2 - val1);
break;
case '/':
stack.push(val2 / val1);
break;
case '*':
stack.push(val2 * val1);
break;
}
}
}
return stack.pop();
}
// calling the above method
// returns 9
console.log(postFixEvaluation("235*+8-"));
// returns postfix evaluation can't be performed
console.log(postFixEvaluation("23*+"));