栈是一种==后进先出==的数据结构。

图片来源于网络

JS模拟栈

虽然JavaScript中没有栈,但是我们可以用数组来实现栈的功能。

	// 定义一个数组用来模拟栈
	const stack = [];
	// 用数组的Push方法模式入栈
	stack.push(0);
	stack.push(1);
	stack.push(2);
	// 用数组的pop方法模拟出栈
	const item0 = stack.pop();
	const item1 = stack.pop();
	const item2 = stack.pop();

入栈出栈过程

入栈过程

执行第4行代码,将0入栈。 在这里插入图片描述 执行第5行代码,将1入栈。 在这里插入图片描述 执行第6行代码,将2入栈。 在这里插入图片描述

出栈过程

执行第8行代码,将2出栈。

在这里插入图片描述 执行第9行代码,将1出栈。 在这里插入图片描述 执行第10行代码,将0出栈。 在这里插入图片描述

栈的应用

有后进先出特点的问题,都可以尝试用栈来解决。

例:有效的括号(leetcode:20)

leetcode

思路

{ [ ( ) ] }

越靠后的左括号,对应的右括号越靠前;

第一步:扫描字符串将左括号入栈;

第二步:判断栈顶括号,和入栈的右括号类型是否匹配;

匹配则出栈栈顶的左括号;

不匹配直接判定不合法;

第三步:如果最后栈不为空,则判定不合法;

代码

var isValid = function(s) {
	//优化:判断字符串长度是否为奇数,为奇数判断不合法。
    if(s.length % 2 ===1){
        return false;
    }
    // 新建一个栈
    const stack = [];
    // 扫描字符串
    for(let i = 0; i < s.length; i++){
        const c = s[i];
        // 左括号入栈
        if(c === '(' || c === '[' || c === '{'){
            stack.push(c);
        }else{
            // 栈顶指针
            const t = stack[stack.length-1];
            // 判断栈顶指针和右括号类型是否匹配
            if( (t === '(' && c ===')') || (t === '[' && c ===']') || (t === '{' && c ==='}')){
                // 类型匹配栈顶指针出栈
                stack.pop();
            }else{
                // 类型不匹配,循环结束
                return false;
            }
        }
    }
    return stack.length === 0;
};

在这里插入图片描述