RPN问题(运营顺序)

时间:2011-09-30 14:38:24

标签: java calculator rpn

我正在尝试制作一个操作顺序的简单计算器。 我在互联网上读过并发现了RPN算法(反向波兰表示法)。

修改

让我们举一个例子: 2 * 5 - 3 + 4

好的,我做了,你们两个都说现在检查一下:

Proc是数字和操作的字符串数组。 Proc将为{2,*,5, - ,3,+,4}

这是代码:

    int tempt = 0;
    Stack <Double> stc = new Stack <Double>();
    while (tempt < proc.length)
    {
        try
        {
            Double num = Double.parseDouble(proc[tempt]);
            stc.push(num);
            tempt++;
        }
        catch (Exception e)
        {
            char [] stcs = proc[tempt].toCharArray();
            switch (stcs[0])
            {
            case '+':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 + a2);
                tempt++;
                break;
            }
            case '-':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 - a2);
                tempt++;
                break;
            }
            case 'x':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 * a2);
                tempt++;
                break;
            }
            case '÷':
            {
                double a2 = stc.pop();
                double a1 = stc.pop();
                stc.push(a1 / a2);
                tempt++;
                break;
            }
        }

        }

仍然没有工作

我怎样才能让它运作良好? 帮助我PLS!

1 个答案:

答案 0 :(得分:4)

你的算法错了。 RPN中的2 * 5 - 3 + 4转换为:2 5 * 3 - 4 +。我不知道为什么你在两个单独的列表中独立地处理数字和符号:反向波兰表示法:

2 3 + 4 * === (2 + 3) * 4

,而

2 3 4 + * === 2 * (3 + 4)

据说你的程序几乎是正确的,除了对于输入你应该采取一系列符号(值和运算符)。现在你从左到右阅读符号。如果是数字,请将其推入堆栈。如果运算符:弹出前两个值并推送结果。就是这样!


更新:示例

输入:2 5 * 3 - 4 +

堆叠:[]

迭代I :(从输入中读取2

输入:5 * 3 - 4 +

堆叠:[2]

迭代II :(从输入中读取5

输入:* 3 - 4 +

堆叠:[2, 5]

迭代III :(从输入中读取*

输入:3 - 4 +

堆叠:[2 * 5] == [10]

迭代IV :(从输入中读取3

输入:- 4 +

堆叠:[10, 3]

迭代V :(从输入读取-

输入:4 +

堆叠:[10 - 3] == [7]

迭代VI :(从输入中读取4

输入:+

堆叠:[7, 4]

迭代VII :(从输入中读取+

输入:``

堆叠:[7 + 4] == [11]

结果:11(没有进一步的输入,结果是堆栈中唯一的元素)


更新2:来吧!

您正在编写一个程序来解释RPN,但您正在使用infix notation来提供它!试试这个输入:

String[] proc = new String[]{"2", "5", "x", "3", "-", "4", "+"};

您的代码中还有其他一些缺陷(重复,异常驱动的流控制,没有错误处理),但基本上使用此输入它应该可以工作。