当前位置: 代码迷 >> J2SE >> 一个关于栈的java编程题,高手帮忙看一下,给个解决方案,该如何解决
  详细解决方案

一个关于栈的java编程题,高手帮忙看一下,给个解决方案,该如何解决

热度:83   发布时间:2016-04-24 01:09:55.0
一个关于栈的java编程题,高手帮忙看一下,给个解决方案
编译器和文本编辑器的一个普遍问题是判断一个字符串中的圆括号(或者其他括号)是否平衡且匹配。例如,字符串“((())())()”中的圆括号恰好平衡且匹配,但是字符串“)()(”中的圆括号不平衡,字符串“())”中的圆括号不匹配。
设计方法,当字符串的圆括号恰好平衡且匹配时返回true,否则返回false。用一个栈来记录当前扫描到的未匹配的左圆括号。
我是个初学者,实在没什么思路,希望高手指点,谢谢

------解决方案--------------------
LS说的不是很全面的

1,以左括号开始
2,int sum = 0;出现左括号加1,出现右括号减1.看最后结果是不是0;
)(()) 如果不是以左括号开始,匹配正确,但实际上是不对的

遇到左括号+1,遇到右括号-1,到达0之后,若再遇到左括号+1,若遇到右括号则不匹配
()() 这样的括号匹配就会失败,但是这样实际上是对的

采用堆栈的做法比较合理
给LZ一个取括号内容信息的例子

Java code
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);        }    }}
------解决方案--------------------
遍历整个字符串 
如果是‘(’ 则入栈
如果是‘)’且栈顶元素未'(',则栈顶元素出栈,否则入栈。

如果栈为空,匹配,否则不匹配

  相关解决方案