有效的括号

今天我们开始了一个新的模块,栈和队列,另外昨天肝了一篇栈和队列的文章,大家可以先去了解一下<<希望这篇文章能合你的胃口>>,今天我们先来一道经典题热热身。大家一定要记得打卡,这个题目是真不错。

文章里的所有题目都是经过认真挑选的并且所有代码都经过测试大家可以放心食用。

题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。

示例 1:

输入: "()" 输出: true

示例 2:

输入: "(]" 输出: false

示例 3:

输入: "()]" 输出: false

示例4:

输入:"()["

输出:false

我这里用了两种方法进行解决,第一种是利用ArrayList,第二种是利用栈,今天主要讲一下用栈的方法。思路很简单,我们遇到左括号就将其入栈,遇到右括号就和栈顶元素进行比较,如果是对应的则pop栈顶元素,不对应直接返回false即可。另外我们还需要考虑的就是示例3和示例4这两种情况,需要我们好好思考一下。

面我们直接上动图。


合法的括号

题目代码:

class Solution {
    public boolean isValid(String s) {
       Stack<Character> stack = new Stack<Character>();
        //循环遍历字符串
        for(char ch : s.toCharArray()){
            //入栈的三种情况
            if(ch=='('||ch=='['||ch=='{'){
                stack.push(ch);
            }
            //右括号对比,其中注意为空的情况
            if(ch==')'){
                if(stack.isEmpty()||stack.pop()!='('){
                    return false;
                }
            }
            if(ch==']'){
                 if(stack.isEmpty()||stack.pop()!='['){
                    return false;
                 }
            }
             if(ch=='}'){
                 if(stack.isEmpty()||stack.pop()!='{'){
                    return false;
                }
            }
        }
        //遍历结束的情况
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }
}

这个方法提交的话,接近双一百,是一道非常不错的题目。另外我们改进一下这个代码,让其更简洁。

思路和上面动图代码稍微有些不一样,但是原理是一致的,大家可以看一下代码

class Solution {
    public boolean isValid(String s) {
        LinkedList<Character> stack = new LinkedList<>();
        //遍历字符串
        for (char ch : s.toCharArray()) {
            //遍历到左括号时右括号入栈,右括号来对比时,只需要对比是否相同。
            if (ch == '[') stack.push(']');
            else if (ch == '(') stack.push(')');
            else if (ch == '{') stack.push('}');
            //当ch为右括号时,如果为空,或不对应,则返回false;
            else if (stack.isEmpty() || ch != stack.pop()) return false;
        }
        return stack.isEmpty();//最后判断是否为空。
    }
}