1、概念
栈(stack
)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(ps: 来源百度百科)
2、js中的栈
栈是一个后进先出的数据结构,js中没有栈,但可以用
Array
实现栈的所有功能。
// 创建一个数据模拟栈
const stack = [];
// 入栈
stack.push(1); // stack: [1]
stack.push(2); // stack: [1,2]
// 出栈
stack.pop() // stack: [1]
stack.pop() // stack: []
3、栈的应用场景
- 需要后进先出的场景。
- 比如:十进制转换为2-9的任意进制的数、判断字符串的括号是否有效、函数调用堆栈等...
比如100的八进制,100首先除以8商12余4, 4首先进栈,然后12除以8商1余4,第二个余数4进栈,接着1除以8,商0余1,第三个余数1进栈,最后将三个余数出栈,就得到了100的八进制数144。
4、leetCode
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
// 判断长度是否为偶数
if (s.length % 2 === 1) {
return false;
};
// 定义一个map key为左括号 value对应右括号
const map = new Map()
map.set('(', ')')
map.set('{', '}')
map.set('[', ']')
// 创建一个栈
const stack = [];
for (let i = 0; i < s.length; i++) {
// 获取当前括号
const c = s[i];
// 左括号直接入栈
if (map.get(c)) {
stack.push(c);
} else { // 右括号
// 获取栈顶的括号 (左括号)
const l = stack[stack.length - 1];
// 判断栈顶的括号是否与当前括号对应(左右括号是否匹配)
if (map.get(l) === c) {
stack.pop();
} else {
return false; // 不匹配即无效
}
}
}
return stack.length === 0; // 最后栈的长度如果为0 即为有效的括号
};