主要思路:
遇到左括号则一直压栈,遇到右括号时则从栈中弹出一个元素。
如果此时栈为空,则返回false。
如果这个元素与右括号不匹配,则返回false。
重复此过程,最后判断栈是否为空,若为空则返回true,否则返回false。
代码实现:
//1.3.4 //parentheses package com.qiusongde; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class Parentheses { private static final char LEFT_PAREN = '('; private static final char RIGHT_PAREN = ')'; private static final char LEFT_BRACE = '{'; private static final char RIGHT_BRACE = '}'; private static final char LEFT_BRACKET = '['; private static final char RIGHT_BRACKET = ']'; public static void main(String[] args) { String input = StdIn.readAll().trim(); StdOut.println("input:" + input); StdOut.println(isParenBalanced(input)); } public static boolean isParenBalanced(String input) { Stack<Character> stack = new Stack<Character>(); for(int i = 0; i < input.length(); i++) { char pare = input.charAt(i); if(pare == LEFT_PAREN) stack.push(pare); if(pare == LEFT_BRACE) stack.push(pare); if(pare == LEFT_BRACKET) stack.push(pare); if(pare == RIGHT_PAREN) { if(stack.isEmpty()) return false; if(stack.pop() != LEFT_PAREN) return false; } if(pare == RIGHT_BRACE) { if(stack.isEmpty()) return false; if(stack.pop() != LEFT_BRACE) return false; } if(pare == RIGHT_BRACKET) { if(stack.isEmpty()) return false; if(stack.pop() != LEFT_BRACKET) return false; } } if(stack.isEmpty()) return true; else return false; } }
测试结果: