while (strToken.hasMoreTokens())
{
String i = strToken.nextToken();
char ch = ' ';
ch = i.charAt(0);
int operand;
int operator;
if(Character.isDigit(ch))
{
operand = Integer.parseInt(i);
operandStack.push(operand);
}
else
{
operator = i.charAt(0);
operatorStack.push(operator);
}
}
while(operandStack.size() > 1)
{
operandStack.push(operate(operandStack.pop(),
operandStack.pop(), operatorStack.pop()));
}
resultTextField.setText(Integer.toString(operandStack.peek()));
我的代码不会以前缀表示法评估操作数。我应该如何修改它来评估前缀表示法中的操作数。
答案 0 :(得分:0)
填充堆栈然后开始评估,而在扫描期间遇到运算符时,应弹出操作数,计算结果(通过将遇到的运算符应用于操作数)并将结果推送到堆栈。从右向左扫描。如果从左向右扫描算法则不同。您可以在波兰表示法的维基百科页面上阅读这两种实现。
你现在在做什么:
input: * + 16 4 + 3 1
operand stack: 16 4 3 1
operator stack: * + +
pop + pop 3 pop 1 push 4
operand stack: 16 4 4
operator stack: * +
pop + pop 4 pop 4 push 8
operand stack: 16 8
operator stack: *
pop * pop 8 pop 16
result = 16 * 128
你需要做什么(从右到左):
input: * + 16 4 + 3 1
push 1 push 3
operand stack: 1 3
operator: + (you don't need operator stack)
pop 1 pop 3 push 3+1 = 4
operand stack: 4
push 4 push 16
operand stack: 4 4 16
operator +
pop 16 pop 4 push 4+16 = 20
operand stack: 4 20
operator *
pop 20 pop 4 result 4*20 = 80