【问题标题】:Postfix Calculator giving me wrong answers后缀计算器给了我错误的答案
【发布时间】:2013-11-03 03:06:49
【问题描述】:

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

我的代码是:

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...

答案显然应该匹配。有什么想法吗?

【问题讨论】:

  • 调试器告诉你什么?

标签: java calculator postfix-notation


【解决方案1】:

提示 1:某些操作(例如 /-没有commutative property

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

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

【讨论】:

    【解决方案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 /*错误的输出*/

    【讨论】:

    • 虽然整数除法很好指出,但所有输入 - 从失败的案例来看 - 这个赋值是专门生成的,总是完全可除的,所以不需要浮点表达式。跨度>
    • “使用整数堆栈并不能保证结果是整数”到底是什么意思?这正是它所做的保证。
    • @EJP 我的意思是实际答案,而不是代码评估的答案。即 2/3 应该是 0.66 会给出 0..
    猜你喜欢
    • 2017-04-29
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多