括号序列

2020-11-15  本文已影响0人  小北觅

题目描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

思路:

判断括号序列是否合法的问题,一般都是用栈这种数据结构去做。
本题中,我们可以定义一个Stack,遍历字符串,当遇到左括号:'(', '[',,'{'或者栈为空时,就将当前位置的字符入栈。如果遇到右括号时,就比对当前字符和栈顶字符是不是对应的括号。如果不对应,那么直接返回false,说明这个字符串不是合法的括号序列,如果是对应的括号,那么就把栈顶的字符出栈,进行下一次循环。 最终,如果栈是空,就返回true,栈不为空,就返回false。代码如下:

import java.util.*;
public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValid (String s) {
        // write code here
        char[] arr = s.toCharArray();
        int length = arr.length;
        Stack<Character> stack = new Stack();

        for(int i=0; i < length; i++ ) {
            if(stack.isEmpty() || arr[i]=='(' || arr[i]=='[' || arr[i]=='{') {
                stack.push(arr[i]);
                continue;
            }
            if(arr[i]=='}' && stack.peek()!= '{')
                return false;
            else if( arr[i]==')' && stack.peek()!= '(')
                return false;
            else if(arr[i]==']' && stack.peek()!= '[')
                return false;
            else if(stack.isEmpty())
                return false;
            stack.pop();
        }
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}

解题中遇到的问题:

在遇到右括号时,与栈顶元素对比的方法我用的stack.pop。这会导致改变栈的结构。比如,如果当前if条件不满足,进入到下一个if,但是此时已经把栈顶元素出栈了。经过debug,把pop改为peek方法,在所有if else比较完之后再出栈。

上一篇 下一篇

猜你喜欢

热点阅读