2013-06-21 40 views
4

在直流中,如何彈出並丟棄堆棧頂部的數字?包含三個項目(1 2 3)的堆棧應該成爲具有兩個項目(2 3)的堆棧。目前我正在將數字推到另一個堆棧(Sz)上,但這似乎相當跛腳。dc:我如何彈出(並丟棄)堆棧的頂部號碼?

+1

怎麼會有東西在堆棧上,你不想要? – hendrik

+1

@hendrik:如果你有一個計數器用來控制一個循環的迭代次數,那麼當循環結束時,你必須丟棄計數器。 –

回答

5

有許多方法刪除堆棧的頂部,但他們有副作用。刪除沒有副作用的元素需要避免包含副作用。

要除去沒有副作用的堆棧頂部,請確保頂部是一個數字,然後運行d!=z。如果堆棧有[5],則執行以下操作:

  1. 從項目開始刪除。 Stack: [5]
  2. 重複堆棧頂部。 Stack: [5,5]
  3. 流行頂部2和測試,如果它們不相等:5 != 5Stack: []
  4. 如果測試通過(它不能),運行zStack: []

爲了確保堆的頂部是一個數字,我使用Z這將計算一個字符串的長度或數字中的位數並推回。還有其他選項,比如X.任何能夠使任何數字出現的東西都可以工作,以便與!=兼容。

所以,在所有的情況下複製粘貼完整的答案是:

Zd!=r 

我通常在(爲下降)寄存器d堅持這一點:

[Zd!=r]sD 

,然後我可以運行

lDx 
4

[...答案被刪除,對方的回答是更好的...]

+1

這可能是我所見過的最令人滿意的答案。謝謝!! –

+0

這是一個有趣的解決方案,但它似乎比爲OP預留一個寄存器更加神祕。我唯一的修改是使用's'而不是'S',因爲前者會覆蓋寄存器的任何現有值,所以如果很多事情都被轉儲到寄存器中,則不會浪費存儲器。 – nyuszika7h

+0

@ nyuszika7h:該問題詢問如何在不使用寄存器的情況下丟棄堆棧的頂部。 –