-6

我正在尝试制作一个具有操作顺序的简单计算器。我在互联网上阅读并找到了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;
            }
        }

        }

仍然不起作用

我怎样才能使它也能正常工作?请帮帮我!

4

1 回答 1

4

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

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

尽管

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

话虽如此,您的程序几乎是正确的,除了输入时您应该采用一系列符号(值和运算符)。现在您从左到右阅读符号。如果是数字,则将其压入堆栈。If 运算符:弹出前两个值并推送结果。而已!


更新:示例

输入: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的程序,但您正在使用中缀表示法喂它!试试这个输入:

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

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

于 2011-09-30T14:58:55.087 回答