設計乙個有getmin功能的棧

2021-08-27 18:23:55 字數 1447 閱讀 5496

程式設計師**面試指南 it名企演算法與資料結構題目最優解 第一問

有這樣的乙個問題:

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

這個問題看似不難,只要在棧push每乙個元素的時候將這個元素和乙個最小數min進行大小比較,小於min就把這個元素的值賦給min,如此一來就可以得出所有入棧元素的最小值。但是這有乙個問題:即將棧頂元素pop出來之後,如何判斷此刻棧元素中的最小值?

由於棧本身不支援隨機訪問和加一減一的訪問模式,我們不能通過遍歷棧來獲取最小值。那麼似乎只有這樣乙個辦法:即pop頂元素時將剩下的所有元素逐個pop出來,然後逐個和最小數min比較,小於min就把這個元素的值賦給min,然後壓入另乙個棧,完成所有元素的出棧-入棧,並且找到min之後,再來把元素出棧入棧放回到原來的棧中。

這樣一來開銷非常大,不太實用。

程式設計師**面試指南 it名企演算法與資料結構題目最優解 給出了他的方法,我覺得非常不錯。

他的核心思路是用另外乙個棧的元素來記錄目標棧的每乙個資料段的最小值。

這句話看起來非常難理解,也確實不好總結,所以下面來詳細說明一下。

假設現在壓入了3,4,5,1,2,1這幾個數。那麼棧的儲存模型現在如下圖所示。

左邊是我們的目標棧,右邊是指示左邊最小元素的棧。

聰明的同學可能已經明白了,右邊的每乙個元素代表著左邊棧對應位以下的資料段的最小值(可以忽略』無』,實際上右邊棧中只有3個元素)。例如右邊從上往下的第二個1,對應著左邊棧從上往下的第二個1,那麼這就是說,左邊棧底的四個元素1,5,4,3中最小的元素就是1!其他的同理可推。

那麼也就是說,右邊棧的棧頂的值永遠代表著左邊棧的最小元素值

那麼如此一來**就簡單了。

現在我重寫乙個類,這個類實現一般的pop,push功能,外加乙個getmin函式

class minstack

else

}int pop()

if(s.top()==smin.top())

smin.pop();

value=s.top();

s.pop();

return value;

}int getmin()

return smin.top();

}};void main()

{ minstack s;

s.push(5);

s.push(2);

s.push(1);

s.push(6);

s.push(7);

s.push(6);

cout

執行結果:

1

5

設計乙個有GetMin功能的棧

兩種資料壓入規則,也就是兩種實現的方法,利用兩個棧,乙個stackdata棧用來壓入所有的資料,所有資料都會壓入此棧,乙個satckmin用來壓入最小元素 對應的就是stackdata中的最小元素 第一種方法 壓棧規則 1 當將資料壓入棧stackdata時,判斷stackmin棧是否為空,為空則將...

設計乙個有getMin功能的棧

使用c 完成 程式設計師 面試指南 it名企演算法與資料結構題目 實現乙個特殊的棧,在實現棧的基本功能基礎上,再實現返回棧中最小元素的操作 使用兩個棧,乙個棧用來儲存當前棧中的元素,起功能和乙個正常的棧沒有區別,這個棧記為stackdata 另乙個棧用於儲存每一步的最小值,這個棧記為stackmin...

乙個有getMin功能的棧

前言 這是學習 程式設計師 面試指南 一書的第一篇文章,也是部落格的第一篇文章,給自己加油,從現在開始堅持記錄學習。題目 實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小值的操作。要求 1.pop push getmin操作的時間複雜度都是o 1 2.設計的棧型別可以使用現成的棧結構...