《算法》1.3.4习题解答

62 阅读1分钟

1.3.4

编写一个Stack的用例Parentheses,从标准输入中读取一个文本流并使用栈判定其中的括号是否配对完整。例如,对于[()]{}{()()}程序应该打印true,对于 [(])则打印false。
就是看括号是否都有另一半,单身狗莫名被踹了一脚的感觉(😫)。
强势分析一波,这道题就是想让我们利用栈道特性来搞事,虽然也有别的解法(hash),但我们还是按照题意来搞。 只要我们遇到左括号的时候入栈,遇到右括号的时候出栈,最后栈内为空就说明括号序列是合法的。
上代码:

public static boolean isValid(String str) {
    if (str==null||str.length()==0) {
        throw new NoSuchElementException();
    }
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); ++i) {
        //遇到左括号就入栈
        char c = str.charAt(i);
        //true 匹配为左括号
        if (c=='('||c=='{'||c=='[') {
            stack.push(c);
        } else {
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.pop();
          if ((c==')'&&top!='(')||
              (c=='}'&&top!='{')||
              (c==']'&&top!=']')){
              return false;
          }
        }
    }
    return stack.isEmpty();
}


public static void main(String[] args) {
    String str = "{{{}}}";
    System.out.println(E10304.isValid(str));
}