我正在尝试制作一个操作顺序的简单计算器。 我在互联网上读过并发现了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!
答案 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 +
堆叠:[]
2
)输入:5 * 3 - 4 +
堆叠:[2]
5
)输入:* 3 - 4 +
堆叠:[2, 5]
*
)输入:3 - 4 +
堆叠:[2 * 5]
== [10]
3
)输入:- 4 +
堆叠:[10, 3]
-
)输入:4 +
堆叠:[10 - 3]
== [7]
4
)输入:+
堆叠:[7, 4]
+
)输入:``
堆叠:[7 + 4]
== [11]
11
(没有进一步的输入,结果是堆栈中唯一的元素)您正在编写一个程序来解释RPN,但您正在使用infix notation来提供它!试试这个输入:
String[] proc = new String[]{"2", "5", "x", "3", "-", "4", "+"};
您的代码中还有其他一些缺陷(重复,异常驱动的流控制,没有错误处理),但基本上使用此输入它应该可以工作。