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

标签 java algorithm data-structures

我有一个方法可以使用 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);
    }
}

最佳答案

眼前的问题是这个

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

如果您使用 java 1.7 或更低版本,首先给您 char = "",因此您将退出循环,因为堆栈为空...

注意:这已在 java 1.8 中更改 split difference between java 1.7 and 1.8

更改为:

char[] tokens = str.toCharArray();

不过我猜你需要考虑这样一个事实,即在你的第一个 ( 之前可能有字符,然后你可能有其他字符 ()

关于java - 无法正确验证java方法中的平衡括号解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554277/

相关文章:

java - Hibernate多对多集合过滤

java - Java 中具有 >32 位偏移量的 FileRead

java - 如何在 Spring 配置中将静态常量作为参数传递?

c++ - 对为什么我的算法运行速度比应有的速度慢感到困惑

algorithm - 具有优先节点的最短路径

c - C中的字典/映射/键值对数据结构

hibernate - 努力优化Hibernate中的N+1查询

c++ - 加油站任务变化的DP算法

java - 使用 Play 2.0.x 永久重定向

检测我的数字异常增长/下降的算法