前缀表示法 - Java

时间:2015-04-16 00:40:51

标签: java prefix notation

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()));

我的代码不会以前缀表示法评估操作数。我应该如何修改它来评估前缀表示法中的操作数。

1 个答案:

答案 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