實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小的元素的操作。
第乙個想法就是最小數單獨儲存,只有這樣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,否則直接彈出棧...