基本概念:

栈是一种受限的只允许在栈顶进行插入和删除操作的数据结构,符合先进后出的特性。js中并没有栈,但是可以使用Array模拟实现栈的所有功能。

面试题

有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?()

A:5 4 3 6 1 2 B:4 5 3 2 1 6 C:3 4 6 5 2 1 D:2 3 4 1 5 6

模拟实现栈:

首先需要知道栈的常用操作:

(1)push。

(2)pop。

(3)peek:返回栈顶的元素,但是与pop不同的是它不会删除栈顶的元素,仅仅只是返回它。

(4)isEmpty:如果栈里没有任何元素就返回true,否则返回false。

(5)size:与数组的length属性类似。

(6)toString:将栈结构的内容以字符串形式返回。

function Stack() {
    this.items = [];
    //栈的常用操作
    //1,push
    Stack.prototype.push = function (element) {
        this.items.push(element);
    };

    //2,pop
    Stack.prototype.pop = function () {
        return this.items.pop();
    };

    //3,peek
    Stack.prototype.peek = function () {
        return this.items[this.items.length - 1];
    };

    //4,isEmpty
    Stack.prototype.isEmpty = function () {
        return this.items.length === 0;
    };

    //5,size
    Stack.prototype.size = function () {
        return this.items.length;
    };

    //6,toString
    Stack.prototype.toString = function () {
        let resultString = "";
        for (let i = 0; i < this.items.length; i++) {
            resultString += this.items[i] + " ";
        }
        return resultString;
    };
}

let stack = new Stack();
//下面我们来测试一下
stack.push(10);
stack.push(20);
console.log(stack); //[10, 20]

stack.pop();
console.log(stack); //[10]

console.log(stack.peek()); //[10]

console.log(stack.isEmpty()); //false

console.log(stack.size()); //1

console.log(stack.toString()); //'10'

练习一:十进制转二进制

function dec2bin(decNumber) {
    //1,新建一个栈用于存储每次获得的余数
    let stack = [];

    //2,循环操作
    while (decNumber > 0) {
        //3,将每次获得的余数push进栈中
        stack.push(decNumber % 2);

        //4,获取每次整除后的结果并将其作为下一次运行的数字
        decNumber = Math.floor(decNumber / 2);
    }

    //5,最后将栈中的所有元素倒序输出
    let result = "";
    while (stack.length) {
        result += stack.pop() + "";
    }
    return result;
}

//测试一下
console.log(dec2bin(100)); //1100100

练习二:leetcode 20 有效的括号

解题思路:新建一个栈,扫描字符串,将遇到的左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定为不合法。

function isValid(s) {
    //s的长度如果是奇数,那么直接返回false
    if (s.length % 2 === 1) {
        return false;
    }
    //新建一个栈
    let stack = [];
    //遍历s并将所有左括号入栈
    for (let item of s) {
        if (item === "(" || item === "{" || item === "[") {
            stack.push(item);
        } else {
            //获取到栈顶的元素
            let stackPeek = stack[stack.length - 1];
            //如果栈顶的元素与右括号相匹配,则将该左括号出栈
            if (
                (stackPeek === "(" && item === ")") ||
                (stackPeek === "{" && item === "}") ||
                (stackPeek === "[" && item === "]")
            ) {
                stack.pop();
            } else {
                return false;
            }
        }
    }
    //最后判断栈是否为空
    return stack.length === 0 ? true : false;
}

//测试一下
console.log(isValid("({}")); //false

前端与栈:js中的函数调用栈

function test1() {
    test2()
}

function test2() {
    test3()
}

function test3() {
    console.log('test')
}

test1()

上面我们模拟实现了js中函数调用栈,可以看到最先被调用的但是却最后才被执行,这就完全符合了栈的先进后出特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值