最近我一直在通过在java中实现堆栈来创建计算器。我在代码中遇到了stack.peek().equals("(")
的问题,我尝试了几种不同的方法来解决这个问题,但似乎没什么用。
以下是我的代码:
import java.util.Scanner;
import java.util.Stack;
public class URCalculator {
public static Scanner scan = new Scanner(System.in);
public static Stack<String> uRStack = new Stack<String>();
public static Stack<String> uROPStack = new Stack<String>();
public static void main(String[] args) {
prompt();
String val = scan.next();
pusher(splitInput(val));
while(!uRStack.empty()) {
System.out.println(uRStack.pop());
}
}
public static String[] splitInput(String val) {
return val.split("(?!^)");
}
public static void pusher(String[] s) {
int counter = 0; // counter determines if there is a numeric value
in the index prior, if so then we concatenate and add back to the stack.
for(int i=0; i<s.length; i++) { // loops through split input array
if(isNumeric(s[i]) && counter != 0) { // checks if number and if
previous number
pushNumeric(uRStack.pop() + s[i]);
counter++;
}
else if (isNumeric(s[i])) { // checks if just a number
pushNumeric(s[i]);
counter++;
}
else if(isOperator(s[i])) { // if not number then reset counter for latter values
addOperator(s[i]);
counter=0;
}
}
uRStack.push(uROPStack.pop());
}
public static void addOperator(String s) { // uses cases to determine logic for operator stack
switch(s) {
case "+":
if(!uROPStack.empty()){
while(!"(".equals(uROPStack.peek()) && !uROPStack.empty()) { // while operators not of lower precedence then push pop
uRStack.push(uROPStack.pop());
}
}
uROPStack.push(s);
break;
case "-":
if(!uROPStack.empty()){
while(!"(".equals(uROPStack.peek()) && !uROPStack.empty()) { // while operators not of lower precedence then push pop
uRStack.push(uROPStack.pop());
}
}
uROPStack.push(s);
break;
case "*":
if(!uROPStack.empty()) {
while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { // while operators of equal or greater precedence then push pop
uRStack.push(uROPStack.pop());
}
}
uROPStack.push(s);
break;
case "/":
if(!uROPStack.empty()) {
while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { // while operators of equal or greater precedenc then push pop
uRStack.push(uROPStack.pop());
}
}
uROPStack.push(s);
break;
case "(":
uROPStack.push(s);
break;
case ")":
if(!uROPStack.empty()){
while(!"(".equals(uROPStack.peek())) {
uRStack.push(uROPStack.pop());
}
}
break;
}
}
我已经为上下文添加了main和pusher方法,但真正的问题在于addOperation方法,特别是while循环中的第一个boolean。我得到的错误发布在下面:
Hello and welcome to the URCalculator. Please type an operation
1-2-3-4-5
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at URCalculator.addOperator(URCalculator.java:129)
at URCalculator.pusher(URCalculator.java:107)
at URCalculator.main(URCalculator.java:14)
我理解我的代码并不是最优雅的代码,也没有完成,但我似乎无法理解为什么我会收到我得到的错误。我检查的一件事是当我删除!"(".equals(uROPStack.peek())
时
从表达式来看,事情似乎顺利进行。问题是我仍然需要处理我的堆栈中的paranthetical案例,所以我不知道该怎么做。
答案 0 :(得分:1)
这种情况被破坏了:
!"(".equals(uROPStack.peek()) && !uROPStack.empty()
如果uROPStack
为空,则uROPStack.peek()
会抛出EmptyStackException
。
如果您翻转条件,它将按预期工作:
!uROPStack.empty() && !"(".equals(uROPStack.peek())
这里,由于&&
运算符的短路行为,
如果第一个条件为假(=堆栈为空),
那么第二个条件(.peek()
)将不会被执行,
并且你得到了理想的行为。
你没有问过这个问题,但另一个问题是等待在这里爆炸:
if(!uROPStack.empty()) { while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { uRStack.push(uROPStack.pop()); } }
也就是说,因为uROPStack.pop()
循环体中的while
,
循环条件中的uROPStack.peek()
可能会导致EmptyStackException
。您需要确保循环条件中堆栈不为空:
while(!uROPStack.peek().isEmpty() && ("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek()))) {