棧和佇列練習之設計乙個getMin功能的棧(士)

2021-10-06 22:57:06 字數 1834 閱讀 8723

實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小的元素的操作。

第乙個想法就是最小數單獨儲存,只有這樣getmin操作才實現o(1)時間複雜度,但是如果只設定乙個變數去儲存進棧時的最小值,那麼出棧時如果出棧的數就是最小數,則最小數就無法更新成此刻的最小數了。所以一定要把進棧時所有更新的最小數都儲存,且要滿足後更新的數先刪除,也就是後進先出,那就也用棧結構儲存最小數。

設計兩個棧,乙個棧儲存當前棧中的元素,其功能和乙個正常的棧沒有什麼區別,這個棧記為stackdata;另乙個棧用於儲存每一步的最小值,這個棧記為stackmin。

具體實現方案一

;//每乙個棧頂都是當前最小值

}public

void

push

(int newnum)

else

if(newnum <=

this

.stackmin.

peek()

)this

.stackdata.

push

(newnum)

;//資料棧進棧

}public

intpop()

int value =

this

.stackdata.

pop();

//取資料棧棧頂

if(value ==

this

.getmin()

)return value;

}}具體實現方案二

}}這是《程式設計師**面試指南》一書中的第一道題,也是難度級別最簡單的題,為什麼會出現在這本書中呢,我猜想算是作者幫助大家複習基礎知識吧。但是這道題的兩種方案,也提醒這我時時刻刻要考慮時間與空間之間的關係。方案一,最小值棧空間占用少,但是每次出棧時都要判斷是否用更新棧,時間占用多。方案二,最小值棧空間占用大,但是每次出棧操作,直接「無腦」pop就行,時間占用少。《程式設計師**面試指南》這本書有個由淺及深的過程,讓我對演算法少了些牴觸,很推薦大家購買此書。

謝謝**

你點的每乙個贊,我都會當成喜歡

你評的每乙個字,我都會認真對待

5 棧和佇列 兩個棧實現乙個佇列

考察棧和佇列 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。1 基礎概念 參考 棧 限定只在表尾進行刪除插入操作的線性表。返回 1 2 3 我們把允許刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧 棧又稱為後進先出 last...

兩個棧實現乙個佇列和兩個佇列實現乙個棧

stack 後進先出 lifo 是在表的一端進行插入或刪除運算的線性表,我們把插入 刪除的這一端稱為棧頂 top 另一端稱為棧底 bottom e push e item 把元素壓入棧頂並返回此元素 e pop 移除棧頂元素並返回此元素 e peek 檢視棧頂元素而不移除它 boolean empt...

兩個棧實現乙個佇列和兩個佇列實現乙個棧

棧的特性 先進後出 filo 佇列的特性 先進先出 fifo 1 兩個棧實現乙個佇列 1 思路 入棧時,直接壓入棧1中 如果棧1滿了,判斷棧2是否為空,若為空,則將棧1元素全部倒入棧2,再入棧 若棧2不為空,則不能再入元素 出棧時,判斷棧2是否為空,若棧為空,則將棧1中的元素倒入棧2,否則直接彈出棧...