我有一种方法应该使用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.7
注意:这在Java 1.7和1.8之间的拆分差异中已更改java 1.8
java 1.8
改成:
char[] tokens = str.toCharArray();
但是我想您需要考虑这样一个事实:在您的第一个字符之前(可能有字符,然后您可能还有其他字符,(并且)
(
)