【发布时间】:2018-04-19 11:01:36
【问题描述】:
所以这个程序假设从 GUI 中获取一个语法正确的中缀表达式,其中包含整数操作数和四个算术运算符 (+ - * /) 并显示结果。在括号中输入表达式时我遇到了麻烦。
比如这个表达式
5+3-2
将返回 6,但括号中的表达式相同
(5+3-2)
返回一个空堆栈异常。
我已尝试尽可能仔细地逐步完成此操作,但我知道是否有用。编译器在第三个 while 循环中指出错误,这表明我最好的猜测是堆栈 valueStack 当时没有两个值,但我似乎无法弄清楚原因。谁能帮我弄清楚我做错了什么?
public String infix(String expression)
{
expression=expression.replaceAll("[\t\n ]", "");
String operator = "*/+-";
int value1, value2;
char ch;
StringTokenizer tokenizer = new StringTokenizer(expression, operator, true);
Stack<Integer> valueStack = new Stack<Integer>();
Stack<Character> operatorStack = new Stack<Character>();
while(tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
if(isInteger(token) == true)
valueStack.push(Integer.parseInt(token));
else if(token.charAt(0) == '(')
operatorStack.push(token.charAt(0));
else if(token.charAt(0) == ')')
while(operatorStack.peek() != '(')
{
value1 = valueStack.pop();
value2 = valueStack.pop();
valueStack.push(solver(value1, value2, operatorStack.pop()));
operatorStack.pop();
}
else if(token.charAt(0) == '+' || token.charAt(0) == '-' || token.charAt(0) == '*' || token.charAt(0) == '/')
{
while(!operatorStack.isEmpty() && precedence(token.charAt(0)) <= precedence(operatorStack.peek()))
{
value1 = valueStack.pop();
value2 = valueStack.pop(); //empty stack error starts here
valueStack.push(solver(value1, value2, operatorStack.pop()));
}
operatorStack.push(token.charAt(0));
}
}
while(!operatorStack.isEmpty())
{
value1 = valueStack.pop();
value2 = valueStack.pop();
ch = operatorStack.pop();
valueStack.push(solver(value1, value2, ch));
}
String result = Integer.toString(valueStack.pop());
return result;
} //End of infix
public static boolean isInteger(String s)
{
try
{
Integer.parseInt(s);
}
catch(NumberFormatException e)
{
return false;
}
catch(NullPointerException e)
{
return false;
}
return true;
} // end of isInteger
public int solver( int value1, int value2, char operator)
{
try
{
if(operator == '*')
return value2 * value1;
else if(operator == '/')
return value2 / value1;
else if(operator == '+')
return value2 + value1;
else if(operator == '-')
return value2 - value1;
else
return 0;
}
catch(ArithmeticException e )
{
JOptionPane.showMessageDialog(null, "Division by Zero");
}
return 0;
} // end of solver
public int precedence(char op)
{
if(op == '+' || op == '-')
return 1;
else if(op == '*' || op == '/')
return 2;
else
return 0;
} // end of precedence
【问题讨论】:
-
我对这个问题投了反对票,因为这里的代码太多了。为了明确您的问题出在哪里,请删除任何不直接导致您的问题的代码,如果您可以将其减少到十行或更少,我将考虑撤回反对票。见:How to create a Minimal, Complete, and Verifiable example
标签: java exception stack infix-notation