📜  JavaScript中Stack的实现

📅  最后修改于: 2021-05-20 08:03:27             🧑  作者: Mango

在本文中,我们将使用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()
}

如您所见,上面的定义创建了一个堆栈类的框架,其中包含一个构造函数,在该构造函数中我们声明了一个实现堆栈的数组。因此,随着堆栈类对象的创建,该构造函数将被自动调用。

现在让我们看一下每种方法的实现:

  1. 推送:将元素添加到堆栈中
    // push function
    push(element)
    {
        // push element into the items
        this.items.push(element);
    }
    

    此方法在堆栈顶部添加一个元素

  2. 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();
    }
    

    此方法返回堆栈的最上层元素并将其删除。在空堆栈上调用时返回下溢。

  3. 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时很有用。

  1. isEmpty():如果堆栈为空,则返回true
    // isEmpty function
    isEmpty()
    {
        // return true if stack is empty
        return this.items.length == 0;
    }
    

    如果堆栈为空,则返回true。

  2. 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*+"));