力扣-->#20. 有效的括号-->栈-简单(栈)

20. 有效的括号

题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:
输入:s = "()"
输出:true

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

示例 3:
输入:s = "(]"
输出:false

示例 4:
输入:s = "([)]"
输出:false

示例 5:
输入:s = "{[]}"
输出:true

提示:
1 <= s.length <= 10^4
s 仅由括号 '()[]{}' 组成

方法一:栈
这到题可谓是栈最基本的用法,也算经典,这里将几个需要注意的地方:
1.“{ [ } ]”、“{ } (”、“( } )”类似这类括号序列都是不合法的,需要返回false;
2.在出栈前,记得先判断栈是否为空,否则易出现空指针异常;
3.我们都知道入栈为push(),出栈为pop(),但是当需要获取栈顶元素但不想取出时,应用peek()而非pop();
4.返回值:一系列的if用于判断括号是否合法,不合法的情况有很多,且条件都不一样,将不合法的情况一一排除后,剩下的最后一个情况是栈是否为空,若栈为空,说明栈中的括号已经全部按序弹出了,返回false;若不为空,说明还有不满足条件的括号未弹出,则返回true,true与false可直接由语句stack.isEmpty()一笔概括。

执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了98.90%的用户
内存消耗:36.4 MB, 在所有 Java 提交中击败了60.34%的用户
通过测试用例:91 / 91

class Solution {
    public boolean isValid(String s) {
        if(s.length()%2==0){    //若长度为单数,直接返回false
            Stack stack=new Stack<>();
            char[] c=s.toCharArray();
            for(int i=0;i

方法二:栈+Map

利用map集合键值对的特性直接将左右括号配对,对比时直接获取栈顶元素对应的(map中)右空号,即可判断是否配对。

执行结果:通过
执行用时:2 ms, 在所有 Java 提交中击败了53.99%的用户
内存消耗:39.7 MB, 在所有 Java 提交中击败了10.69%的用户
通过测试用例:91 / 91

class Solution {
    //若为左括号,则直接压入栈中
    //若为右括号,则获取栈顶括号与当前括号进行匹配,匹配就下一个,不匹配就false
    //  若最后不为空栈,说明还有括号未被匹配,false
    //  若最后为空栈,说明匹配成功,true
    public boolean isValid(String s){
        //用成对的数据结构来记录
        Map map = new HashMap();
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');

        Stack stack=new Stack();//用来存放括号
        char[] c=s.toCharArray();
        for (char c1 : c) {
            if (map.containsKey(c1)){
                //包含这个key,说明是右括号,直接入栈
                stack.push(c1);
            }else {
                //不包含说明是value,说明是左括号,进行判断
                if(stack.isEmpty()){//判栈空
                    return false;
                }
                if (!map.get(stack.peek()).equals(c1)){//注意这个语句,通过获取栈顶元素来获取map中对应的右括号
                    return false;   //右括号已出现,但不匹配栈顶左括号
                }else {
                    stack.pop();
                }
            }
        }
        if (!stack.isEmpty()){//有遗留的未被判断的括号
            return false;
        }
        return true;
    }
        
}

方法三:直接存入右括号

在判断时,若为左括号,则直接存入对应的右括号;
若不是左括号,则作判栈空或弹出栈顶元素进行是否一致的对比;
最后用栈是否为空来判断是否有遗留括号未对比,来作为最终的返回值。

执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了98.80%的用户
内存消耗:39.3 MB, 在所有 Java 提交中击败了42.59%的用户
通过测试用例:91 / 91

class Solution {
    
    public boolean isValid(String s){
        Stack stack=new Stack<>();
        for (char c : s.toCharArray()) {
            if (c=='('){//如果是左括号,直接存入右括号
                stack.push(')');
            }else if (c=='['){
                stack.push(']');
            }else if (c=='{'){
                stack.push('}');
            }else if (stack.isEmpty() || stack.pop()!=c){//因为是右括号,所以直接判空并出栈对比即可
                return false;
            }
        }
        return stack.empty();
    }
        
}

平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!

你可能感兴趣的:(力扣,#,栈,leetcode,算法,数据结构,栈,java)