日期:2014-05-20 浏览次数:20994 次
import java.util.*;
public class Test {
    public static void main(String[] args) throws Throwable {
        String s = "((abc(def(gh)ijk)lmm(opq)rst)uv(wx)yz)";
        Stack<String> stack = new Stack<String>();
        List<String> data = new ArrayList<String>(); //保存括号对的内容
        StringBuilder buf = new StringBuilder();
        int count = 0;
        boolean error = false; //检验括号对是否合法
        String pop = "";
        for (char c : s.toCharArray()) {//遍历字符
            if ("()".indexOf(c) >= 0) { //如果遇到括号字符
                if (buf.length() > 0) { //把字符串信息压栈
                    stack.push(buf.toString());
                    buf.delete(0, buf.length());
                }
                if (c == '(') { //遇到左括号,压栈,计数器加1
                    count++;
                    stack.push("(");
                
                } else if (c == ')') { //遇到右括号,计数器减1,堆栈内容出栈直到遇到左括号
                    count--;
                    buf.append(")");
                    pop = "";
                    while (stack.size() > 0) {
                        pop = stack.pop();
                        buf.insert(0, pop);
                        if (pop.equals("(")) {
                            break;
                        }
                    }
                    if (! pop.equals("(")) { //如果找不到左括号,说明语法有问题
                        error = true;
                        break;
                    } else { //找到左括号,则保存括号对内容,同时把括号对内容作为上级括号对的数据再压栈
                        stack.push(buf.toString());
                        data.add(buf.toString());
                        buf.delete(0, buf.length());
                    }
                } 
            } else { //非括号字符,则保存字符
                buf.append(c);
            }
        }
        if (count != 0) error = true;
        System.out.println("括号对匹配 " + error);
        System.out.println("括号对的内容");
        for (String d : data) {
            System.out.println(d);
        }
    }
}
------解决方案--------------------
遍历整个字符串  
如果是‘(’ 则入栈
如果是‘)’且栈顶元素未'(',则栈顶元素出栈,否则入栈。
如果栈为空,匹配,否则不匹配