我对计算器的理解是它们是基于堆栈的。当您使用大多数计算器时,如果您输入1 + 2 [enter] [enter]
,则会获得5
。 1
被推入堆栈,+
是运算符,然后2
被推入堆栈。第一个[enter]
应该从堆栈中弹出1
和2
,将它们添加到获取3
然后将3
推回堆栈。第二个[enter]
无法访问2
,因为它实际上并不存在。
如何保留2
以便第二个[enter]
可以使用它?
2
之前是否将3
推回到堆栈中,还是将其保留在其他地方供以后使用?如果它被推回到堆栈上,你是否可以通过反复执行[operator] [number] [enter] [enter]
来导致堆栈溢出?
答案 0 :(得分:4)
唯一真正基于堆栈的计算器是具有反向波兰表示法作为输入法的计算器,因为该表示法直接在堆栈上运行。
答案 1 :(得分: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 +
因此它可能是所用硬件的功能。
答案 2 :(得分:2)
您需要做的就是保留最后一个运算符和操作数,如果堆栈为空则只应用它们。
答案 3 :(得分:0)