认识栈
栈(Stack)是一种数据结构,它遵循后进先出(Last In, First Out,LIFO)的原则。也就是说,最后一个被放入栈中的元素是第一个被取出的元素。
栈的实现
栈可以通过数组或链表来实现:
-
数组实现:
- 使用一个固定大小的数组来存储栈中的元素。
- 需要一个变量(通常叫做栈顶指针)来跟踪栈顶元素的位置。
-
链表实现:
- 使用链表的节点来表示栈中的元素。
- 栈顶指针指向链表的头节点。
栈的应用
栈广泛应用于许多计算机科学领域,例如:
- 函数调用:在程序执行过程中,函数调用使用栈来保存返回地址和局部变量,这被称为调用栈。
- 表达式求值:例如,中缀表达式转换为后缀表达式(逆波兰表达式)以及后缀表达式的求值。
- 括号匹配:用栈来检查括号是否成对匹配。
- 深度优先搜索(DFS) :DFS 算法通常使用栈来记录访问的节点。
示例代码(Javascript)
下面是一个使用 JavaScript 列表实现的简单栈示例:
const stack = []
stack.push('绿豆')
stack.push('小布丁')
stack.push('老布丁')
stack.push('老冰棍')
while (stack.length) {
const top = stack[stack.length - 1]
console.log('我想吃' + top);
stack.pop()
}
// 输出
// 我想吃老冰棍
// 我想吃老布丁
// 我想吃小布丁
// 我想吃绿豆
利用栈知识解力扣20题——有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。 示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
解题思路
- 提前准备一个栈
- 遍历字符串s
- 取到的是左括号,就把它的另一半存入栈中
- 如果取到的是右括号,将栈顶的元素取出该字符进行对比
解题代码
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const obj = {
'(' : ')',
'[' : ']',
'{' : '}'
}
const stack = [] // 提前准备一个栈
for (let i = 0; i < s.length; i++) {
if (obj[s[i]]) {
stack.push(obj[s[i]]) // 取到的是左括号,就把它的另一半存入栈中
} else {
if (stack.pop() !== s[i]) { // 如果取到的右括号不和栈内的字符相同返回false
return false
}
}
}
return !stack.length // 如果字符串都遍历结束或者栈为空,则返回true;如果栈内还有,则返回false
};