一尘不染

无法正确验证Java方法中的平衡括号解析

algorithm

我有一种方法应该使用Java来验证字符串中正确的打开和关闭括号。此方法将用于解析数学表达式,因此平衡括号非常重要。由于某些原因,在这两个运行中它都返回false:

System.out.println(parChecker("(()"));  // returns false :-)
System.out.println(parChecker("((()))")); // returns false :-(  WHY??

这是使用堆栈来解决问题的方法。这里有些错误,因为对于一组均衡的括号,它也返回false。有什么问题?先感谢您。

public static boolean parChecker(String str) {
    String[] tokens = str.split("");
    int size = tokens.length;
    Stack theStack = new Stack(size);
    int index = 0;
    boolean balanced = true;
    while ((index < size) && balanced) {
        String symbol = tokens[index];
        if (symbol.equals("(")) {
            theStack.push(symbol);
        } else {
            if (theStack.isEmpty()) {
                balanced = false;
            } else {
                theStack.pop();
            }
        }
        index++;
    }

    if (balanced && theStack.isEmpty()) {
        return true;
    } else {
        return false;
    }

}

这是我正在使用的堆栈类:

public class Stack {

    private Object [] stack;
    private int maxSize = 0;
    private int top;

    public Stack(int size){
        maxSize = size;
        stack = new Object[maxSize];
        top = -1;
    }

    public void push(Object obj){
        top++;
        stack[top] = obj;
    }

    public Object pop(){
        return stack[top--];
    }

    public Object peek(){
        return stack[top];
    }

    public boolean isEmpty(){
        return (top == -1);
    }

    public boolean isFull(){
        return (top == maxSize -1);
    }
}

阅读 500

收藏
2020-07-28

共1个答案

一尘不染

眼前的问题是

String[] tokens = str.split("");

如果使用java 1.7或更少,则为您提供第一个char =“” ,因此由于堆栈为空,您将退出循环…

注意:这在Java 1.7和1.8之间的拆分差异中已更改java 1.8

改成:

char[] tokens = str.toCharArray();

但是我想您需要考虑这样一个事实:在您的第一个字符之前(可能有字符,然后您可能还有其他字符,(并且)

2020-07-28