2

我对计算器的理解是它们是基于堆栈的。当您使用大多数计算器时,如果您键入,1 + 2 [enter] [enter]您会得到5. 1被压入堆栈,+是运算符,然后2被压入堆栈。第一个[enter]应该弹出12退出堆栈,添加它们以获取3然后推3回堆栈。第二个[enter]不应该访问,2因为它实际上不存在于任何地方。

如何2保留以便第二个[enter]可以使用它?

2在之前推回堆栈3还是保留在其他地方供以后使用?如果它被推回堆栈上,你可以想象通过重复执行导致堆栈溢出[operator] [number] [enter] [enter]吗?

4

4 回答 4

4

唯一真正的基于堆栈的计算器是具有反向波兰表示法作为输入法的计算器,因为该表示法直接在堆栈上运行。

于 2010-01-13T05:02:39.013 回答
4

从概念上讲,在硬件中,这些值被放入寄存器。在简单的 ALU(算术逻辑单元(即简单的 CPU))中,其中一个寄存器将被视为累加器。您正在讨论的值可以放在堆栈上进行处理,但是一旦堆栈为空,寄存器值(包括最后一次操作)可能会缓存在这些寄存器中。当被告知再次执行操作时,它使用累加器以及最后一个参数。

例如,

                    Reg1     Reg2 (Accumulator)  Operator
Input 1                         1
Input +                         1                  +
Input 2               2         1                  +
Enter                 2         3                  +
Enter                 2         5                  +
Enter                 2         7                  +

所以它可能是正在使用的硬件的功能。

于 2010-01-13T15:02:34.243 回答
2

您需要做的就是保留最后一个运算符和操作数,并在堆栈为空时应用它们。

于 2010-01-13T05:01:15.793 回答
0

在 wikipedia 上有一个很好的关于 Shutting-yard 算法(中缀 -> rpn 转换)的描述和教程。

于 2010-01-13T05:18:06.410 回答