1

我似乎无法弄清楚为什么我的后缀计算器得到了错误的答案。

我的代码是:

public static int calcRPN(String[] postfix)
{
    Stack<Integer> st = new Stack<Integer>();
    String value;
    int ans = 0;

    for(int i = 0; i < postfix.length; i++){
       value = postfix[i];

       if      (value.equals("+")) ans = st.push(st.pop() + st.pop());
       else if (value.equals("-")) ans = st.push(st.pop() - st.pop());
       else if (value.equals("*")) ans = st.push(st.pop() * st.pop());
       else if (value.equals("/")) ans = st.push(st.pop() / st.pop());
       else st.push(Integer.valueOf(value));
    }

    return ans;
}

输出:

Postfix: [4, 5, 7, 2, +, -, *], Answer: -16, Your answer: 16 ==> NO match...
Postfix: [3, 4, +, 2, *, 7, /], Answer: 2, Your answer: 0 ==> NO match...
Postfix: [5, 7, +, 6, 2, -, *], Answer: 48, Your answer: -48 ==> NO match...
Postfix: [4, 2, 3, 5, 1, -, +, *, +], Answer: 18, Your answer: 2 ==> NO match...
Postfix: [2, 3, *, 10, 4, /, -], Answer: 4, Your answer: -6 ==> NO match...
Postfix: [4, 23, 12, -, 2, *, +], Answer: 26, Your answer: -18 ==> NO match...

答案显然应该匹配。有任何想法吗?

4

2 回答 2

2

提示 1:某些操作(例如/-具有交换性质

在数学中,如果改变操作数的顺序不会改变结果,则二元运算是可交换的。

提示 2:在 之后push(a); push(b); x = pop(); y = pop,a、b、x 和 y 如何关联?

于 2013-11-03T03:15:42.737 回答
2

您的代码的问题是您颠倒了操作数的顺序。虽然这对于 + 和 *无关紧要,但对于 / 和 - 确实很重要。看到这个:http ://www.youtube.com/watch?v=uh7fD8WiT28

输入堆栈(实际)答案(实际)堆栈(你的代码)答案(你的代码)
  1 1 0 1 0
  2 12 0 12 0
  - 弹出() 1-2 弹出()x2 2-1=1

您的代码的另一个问题如下: 请注意,使用整数堆栈并不能保证结果是整数。在某些情况下,这可能会给您带来麻烦,因为在进行除法时会丢失信息。另外,您必须将答案推回堆栈,因此堆栈也需要是浮点数。因此,您需要对堆栈和答案都使用浮点数。

例如:2/3 结果为 0
((2/3)*3) = > 23/3*
输入堆栈
2 2
3 2 3
/ 2 3 / =>答案=0
3 0 3
* 0 3 * =>答案=0
/*错误的输出*/
于 2013-11-03T04:16:21.583 回答