設計乙個有GetMin功能的棧

2021-08-21 18:22:14 字數 1589 閱讀 7973

兩種資料壓入規則,也就是兩種實現的方法,利用兩個棧,乙個stackdata棧用來壓入所有的資料,所有資料都會壓入此棧,乙個satckmin用來壓入最小元素(對應的就是stackdata中的最小元素)。

第一種方法:

(壓棧規則):

(1)當將資料壓入棧stackdata時,判斷stackmin棧是否為空,為空則將此資料也壓入stackmin棧。

(2)若stackmin棧不為空,則將這個要壓入satckdata的資料,與stackmin的棧頂元素比較(也就是原來stackmin棧中的最小元素),如果此資料比stackmin的棧頂元素更小或者相等,則將此資料同步壓入stackmin棧,成為新的最小元素。反之則不壓入。

(出棧規則):

(1)當stackdata棧彈出資料時,設此元素為value。然後比較此資料與stackmin的棧頂元素。若相等,則雙棧同步彈出元素,若大於,則satckmin棧不彈出棧頂元素。此齣棧規則其實與壓棧規則是相對應的。同時我們也知道,因為stackmin中棧頂元素只可能是雙棧的最小元素,所以不存在在出棧時stackdata中資料大於stackmin中的元素的情況。否則說明我們的壓棧規則是不合理的,功能並沒有實現。

具體實現如下:

public class getminstack 

public void push(int newnum) else if(newnum <= this.getmin())

this.stackdata.push(newnum);

} public int pop()

int value = this.stackdata.pop();

if(value == this.getmin())

return value;

//return this.stackdata.pop();

}private int getmin()

return this.stackmin.peek();

}}

壓棧規則與第一種類似:

(1)第一步與上面的第一步相同。

(2)當stackdata壓入的資料小於或等於stackmin的棧頂元素時,則將此資料也同步壓入stackmin。反之則將stackmin中的棧頂元素再重複壓入一次stackmin棧。

出棧規則:

(1)與壓棧規則相對應,每次都是雙棧一起出棧,而不存在比較後stackmin不出棧的情況,因為此種規則下,雙棧元素數量相同,同位置的stackmin中的棧頂元素總是雙棧中的最小元素。

public static class mystack2

public void push(int newnum) else if(newnum此演算法參考了《程式設計師**面試指南一書》,說乙個小問題,因為第乙個方法出棧規則時經過比較後才決定stackmin棧頂元素是否出棧,所以出棧**與第二種是不同的,參考的**中,兩種出棧**相同,也就是第一種中出棧方法中注釋掉的那段**是錯誤的。希望能引起注意。

設計乙個有getMin功能的棧

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

設計乙個有getmin功能的棧

程式設計師 面試指南 it名企演算法與資料結構題目最優解 第一問 有這樣的乙個問題 設計乙個棧,實現棧的基本功能的基礎上,在實現返回棧中的最小元素操作。這個問題看似不難,只要在棧push每乙個元素的時候將這個元素和乙個最小數min進行大小比較,小於min就把這個元素的值賦給min,如此一來就可以得出...

乙個有getMin功能的棧

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