运用栈解算法题——有效括号(上)

88 阅读2分钟

认识栈

栈(Stack)是一种数据结构,它遵循后进先出(Last In, First Out,LIFO)的原则。也就是说,最后一个被放入栈中的元素是第一个被取出的元素。

栈的实现

栈可以通过数组或链表来实现:

  1. 数组实现

    • 使用一个固定大小的数组来存储栈中的元素。
    • 需要一个变量(通常叫做栈顶指针)来跟踪栈顶元素的位置。
  2. 链表实现

    • 使用链表的节点来表示栈中的元素。
    • 栈顶指针指向链表的头节点。

栈的应用

栈广泛应用于许多计算机科学领域,例如:

  1. 函数调用:在程序执行过程中,函数调用使用栈来保存返回地址和局部变量,这被称为调用栈。
  2. 表达式求值:例如,中缀表达式转换为后缀表达式(逆波兰表达式)以及后缀表达式的求值。
  3. 括号匹配:用栈来检查括号是否成对匹配。
  4. 深度优先搜索(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. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。 示例 1:
输入: s = "()"
输出: true

示例 2:

输入: s = "()[]{}"
输出: true

示例 3:

输入: s = "(]"
输出: false

题目链接:leetcode.cn/problems/va…

解题思路

  • 提前准备一个栈
  • 遍历字符串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
};