JavaScript栈怎么调用

发布时间:2022-07-29 15:35:08 作者:iii
来源:亿速云 阅读:137

JavaScript栈怎么调用

在JavaScript中,栈(Stack)是一种常见的数据结构,它遵循“后进先出”(LIFO, Last In First Out)的原则。栈的操作主要包括入栈(push)和出栈(pop),以及查看栈顶元素(peek)等。本文将详细介绍如何在JavaScript中实现栈,并探讨栈的常见应用场景。

1. 栈的基本概念

栈是一种线性数据结构,它只允许在一端进行插入和删除操作。这一端被称为栈顶,另一端被称为栈底。栈的操作主要包括:

2. 使用数组实现栈

在JavaScript中,数组(Array)是一种非常灵活的数据结构,可以用来实现栈。数组的pushpop方法正好对应栈的入栈和出栈操作。

2.1 实现栈类

class Stack {
    constructor() {
        this.items = [];
    }

    // 入栈
    push(element) {
        this.items.push(element);
    }

    // 出栈
    pop() {
        if (this.isEmpty()) {
            return "栈为空";
        }
        return this.items.pop();
    }

    // 查看栈顶元素
    peek() {
        if (this.isEmpty()) {
            return "栈为空";
        }
        return this.items[this.items.length - 1];
    }

    // 判断栈是否为空
    isEmpty() {
        return this.items.length === 0;
    }

    // 获取栈的大小
    size() {
        return this.items.length;
    }

    // 清空栈
    clear() {
        this.items = [];
    }

    // 打印栈内容
    print() {
        console.log(this.items.toString());
    }
}

2.2 使用栈类

const stack = new Stack();

stack.push(10);
stack.push(20);
stack.push(30);

stack.print(); // 输出: 10,20,30

console.log(stack.peek()); // 输出: 30

stack.pop();
stack.print(); // 输出: 10,20

console.log(stack.size()); // 输出: 2

stack.clear();
console.log(stack.isEmpty()); // 输出: true

3. 使用对象实现栈

虽然数组实现栈非常直观,但在某些情况下,使用对象(Object)实现栈可能更高效,尤其是在需要频繁访问栈顶元素时。

3.1 实现栈类

class Stack {
    constructor() {
        this.items = {};
        this.count = 0;
    }

    // 入栈
    push(element) {
        this.items[this.count] = element;
        this.count++;
    }

    // 出栈
    pop() {
        if (this.isEmpty()) {
            return "栈为空";
        }
        this.count--;
        const result = this.items[this.count];
        delete this.items[this.count];
        return result;
    }

    // 查看栈顶元素
    peek() {
        if (this.isEmpty()) {
            return "栈为空";
        }
        return this.items[this.count - 1];
    }

    // 判断栈是否为空
    isEmpty() {
        return this.count === 0;
    }

    // 获取栈的大小
    size() {
        return this.count;
    }

    // 清空栈
    clear() {
        this.items = {};
        this.count = 0;
    }

    // 打印栈内容
    print() {
        console.log(Object.values(this.items).toString());
    }
}

3.2 使用栈类

const stack = new Stack();

stack.push(10);
stack.push(20);
stack.push(30);

stack.print(); // 输出: 10,20,30

console.log(stack.peek()); // 输出: 30

stack.pop();
stack.print(); // 输出: 10,20

console.log(stack.size()); // 输出: 2

stack.clear();
console.log(stack.isEmpty()); // 输出: true

4. 栈的应用场景

栈在计算机科学中有广泛的应用,以下是一些常见的应用场景:

4.1 函数调用栈

在JavaScript中,函数调用栈(Call Stack)是栈的一个典型应用。每当一个函数被调用时,JavaScript引擎会将该函数的执行上下文压入调用栈中。当函数执行完毕后,其执行上下文会从调用栈中弹出。

function first() {
    console.log("First function");
    second();
}

function second() {
    console.log("Second function");
    third();
}

function third() {
    console.log("Third function");
}

first();

在上述代码中,first函数调用second函数,second函数又调用third函数。调用栈的顺序如下:

  1. first被压入栈。
  2. second被压入栈。
  3. third被压入栈。
  4. third执行完毕后弹出栈。
  5. second执行完毕后弹出栈。
  6. first执行完毕后弹出栈。

4.2 括号匹配

栈可以用来检查表达式中的括号是否匹配。例如,检查一个字符串中的括号是否成对出现。

function isBalanced(expression) {
    const stack = new Stack();
    const brackets = { '(': ')', '[': ']', '{': '}' };

    for (let char of expression) {
        if (brackets[char]) {
            stack.push(char);
        } else if (char === ')' || char === ']' || char === '}') {
            if (stack.isEmpty() || brackets[stack.pop()] !== char) {
                return false;
            }
        }
    }

    return stack.isEmpty();
}

console.log(isBalanced("({[]})")); // 输出: true
console.log(isBalanced("({[})"));  // 输出: false

4.3 逆波兰表达式

逆波兰表达式(Reverse Polish Notation, RPN)是一种不需要括号的数学表达式表示法。栈可以用来计算逆波兰表达式的值。

function evalRPN(tokens) {
    const stack = new Stack();

    for (let token of tokens) {
        if (!isNaN(token)) {
            stack.push(Number(token));
        } else {
            const b = stack.pop();
            const a = stack.pop();
            if (token === '+') stack.push(a + b);
            else if (token === '-') stack.push(a - b);
            else if (token === '*') stack.push(a * b);
            else if (token === '/') stack.push(Math.trunc(a / b));
        }
    }

    return stack.pop();
}

console.log(evalRPN(["2", "1", "+", "3", "*"])); // 输出: 9
console.log(evalRPN(["4", "13", "5", "/", "+"])); // 输出: 6

5. 总结

栈是一种简单但强大的数据结构,它在JavaScript中的应用非常广泛。无论是使用数组还是对象实现栈,都可以轻松地完成栈的基本操作。栈在函数调用、括号匹配、逆波兰表达式等场景中都有重要的应用。理解栈的工作原理和使用方法,对于编写高效、可靠的JavaScript代码非常有帮助。

推荐阅读:
  1. 函数的调用原理——栈桢
  2. 函数调用栈

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript

上一篇:win10系统日志怎么如何查看

下一篇:Mysql体系化之JOIN运算实例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》