(二)設計包含min函式的棧

2021-06-27 22:05:20 字數 1081 閱讀 5750

設計包含min函式的棧:

定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素;

要求函式min、push以及pop的時間複雜度都是o(1)。

分析:要得到當前棧的最小元素,且時間複雜度為o(1),這不但要求知道當前棧中的最小元素值(或其所在位置),而且要知道次小元素,這樣才能保證,如果當前棧頂元素為最小元素,被pop後,還能以o(1)的時間複雜度找到次小元素。這樣依次類推,我們可以發現,在最苛刻的情況下(所有棧元素以從大到小的順序入棧),需要乙個和棧大小一樣的輔助棧來滿足時間複雜度o(1)的要求。這應該是一種典型的以空間換時間吧。

基於以上分析,以int型別為例(當然可以使用模板、泛型),我們可以定義棧結構如下:

struct minstackelement 

;struct minstack 

;//stack initialization

minstack minstackinit(int maxsize) 

void minstackfree(minstack &stack) 

//push

void minstackpush(minstack &stack, int d) 

minstackelement* p = &stack.data[stack.top];

p->data = d;

if(stack.top==0)

p->indexofmin=0;

else

stack.top ++; 

}//pop

int minstackpop(minstack& stack) 

stack.top--;

return stack.data[stack.top].data;

}// get the min element

int minstackmin(minstack& stack) 

return stack.data[ ( stack.data[stack.top-1].indexofmin) ].data;

}上面的方法是通過設定當前棧中的最小元素所在位置來獲取最小值,當然也可以通過直接記錄當前棧中的最小值得方法來獲取最小值,而且這樣會更簡單些。

設計包含min函式的棧

本文 題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 分析 這是去年google的一道面試題。我看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後p...

設計包含min函式的棧

定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素,要求函式min,push及pop的時間複雜度都是o 1 棧的資料結構包含兩個普通棧,乙個棧存資料,另乙個棧存最小值 或最小值的位置,如果用stl裡的棧,則不能存最小值的位置,因為stl裡的stack不支援下標索引訪問 cpp view ...

設計包含min函式的棧

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 注 這是06年一道google的面試題.先來說個常規解和他的乙個優化,常規解的時間複雜度符合要求,但需要線性的額外空間.常規解 參考 除了題目要求的棧之外新開乙個棧,用來記...