2010-01-13 66 views
2

我對計算器的理解是它們是基於堆棧的。當你使用大多數計算器時,如果你輸入1 + 2 [enter] [enter],你會得到51被壓入堆棧,+是運算符,則2被壓入堆棧。第一個[enter]應該彈出12離開堆棧,將它們添加到3然後再將3推回堆棧。第二個[enter]不應該有權訪問2,因爲它在任何地方都不存在。計算器堆棧

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

2推回到堆棧之前3還是保留在其他地方供以後使用?如果將它推回堆棧,可以想象通過重複執行[operator] [number] [enter] [enter]會導致堆棧溢出?

+0

只是一個觀察,問題包含術語'堆棧溢出'...有趣的:) – kpax 2010-01-13 05:21:35

+1

@kpax:有趣但不完全是巧合。儘管有誤導性的標識,但這種編程現象是該網站的名稱。 – Dinah 2010-01-13 14:27:16

回答

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

您只需保留最後一個運算符和操作數,並在堆棧爲空時應用它們。

+0

從技術上講,堆棧將不會爲空。它將包含最終計算的數字。 – Dinah 2010-01-13 05:03:59

+0

夠公平的。如果堆棧不包含可用的操作員,那麼。 – 2010-01-13 05:05:26

4

唯一真正的基於堆棧的計算器是具有反向波蘭標記作爲輸入方法的計算器,因爲該標記直接在堆棧上運行。

+1

中綴表達式可以很容易地轉換爲後綴表達式,然後可以使用堆棧。 – 2010-01-13 05:10:37

+2

沒錯。值得強調的是,普通的手動計算器根本不是基於堆棧的。正如馬特指出的,他們可能只有兩個寄存器。他們不會執行運算符優先級或括號(需要堆棧的功能)。 – 2010-01-13 16:43:35