每日算法:有效的括号(Stack)

195 阅读1分钟

这是我参与8月更文挑战的第十七天,活动详情查看:8月更文挑战

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。

  • 左括号必须以正确的顺序闭合。

  • 注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"

输出: true

示例 2:

输入: "()[]{}"

输出: true

示例 3:

输入: "(]"

输出: false

示例 4:

输入: "([)]"

输出: false

示例 5:

输入: "{[]}"

输出: true

回忆一下

什么是栈?

重点一

首先栈是一种数据结构,代表一种特殊的线性表,遵循先进后出,后进先出的原则。

重点二

栈帧随着方法的调用而创建,随着方法结束而销毁,存储了方法的局部变量信息

栈的一些知识

1.创建一个空栈

Stack()

2.测试栈是否为空

boolean empty()

3.查看栈顶部的对象,但不从栈中移除它

Object peek( )

4.移除栈顶部的对象,并作为此函数的值返回该对象

Object pop( )

5.把项压入栈顶部

Object push(Object element)

6.返回对象在栈中的位置,以 1 为基数

int search(Object element)

7.用栈Stack 创建对象(类型不同)

Stack stack = new Stack<>();

Stack stack = new Stack<>();

思路分析

只要遇到括号匹配的问题,我们就选择用栈,遇到左括号就进栈,遇到右括号,就判断栈顶元素是否与之匹配,匹配的话就pop出栈,不匹配的话就返回false。

  1. 遇到左括号((、{、[)就进栈
if(ch == '(' || ch == '{' || ch == '['){
                stack.push(ch);
            }
  1. 遇到右括号,就判断栈顶元素是否与之匹配,匹配的话就pop出栈,不匹配的话就返回false
           else {
                if(!stack.isEmpty()){
                    if(ch == ')'){
                        if(stack.pop() != '('){
                            return false;
                        }
                    }
                    if(ch == '}'){
                        if(stack.pop() != '{'){
                            return false;
                        }
                    }
                    if(ch == ']'){
                        if(stack.pop() != '['){
                            return false;
                        }
                    }
                }
                else {
                    return false;
                }
            }

完整代码

class Solution {
    public boolean isValid(String s) {
         Stack<Character> stack = new Stack<>();
        for(char ch: s.toCharArray()){
            if(ch == '(' || ch == '{' || ch == '['){
                stack.push(ch);
            } else {
                if(!stack.isEmpty()){
                    if(ch == ')'){
                        if(stack.pop() != '('){
                            return false;
                        }
                    }
                    if(ch == '}'){
                        if(stack.pop() != '{'){
                            return false;
                        }
                    }
                    if(ch == ']'){
                        if(stack.pop() != '['){
                            return false;
                        }
                    }
                }
                else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

最后

链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)