栈
栈是一种==后进先出==的数据结构。
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)
思路
{ [ ( ) ] }
越靠后的左括号,对应的右括号越靠前;
第一步:扫描字符串将左括号入栈;
第二步:判断栈顶括号,和入栈的右括号类型是否匹配;
匹配则出栈栈顶的左括号;
不匹配直接判定不合法;
第三步:如果最后栈不为空,则判定不合法;
代码
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;
};