定義棧的數據結構,要求添加一個min函數,可以獲得棧的最小元素。要求函數min、push以及pop的時間複雜度都是O(1)。面試
分析:數組
在棧裏添加一個成員變量存放最小元素(或最小元素的位置)。每次push一個新元素進棧的時候,若是該元素比當前的最小元素還要小,則更新最小元素。
乍一看這樣思路挺好的。但仔細一想,該思路存在一個重要的問題:若是當前最小元素被pop出去,如何才能獲得下一個最小元素?
所以僅僅只添加一個成員變量存放最小元素(或最小元素的位置)是不夠的。咱們須要一個輔助棧。每次push一個新元素的時候,同時將最小元素(或最小元素的位置。考慮到棧元素的類型多是複雜的數據結構,用最小元素的位置將能減小空間消耗)push到輔助棧中;每次pop一個元素出棧的時候,同時pop輔助棧。 數據結構
簡而概之——以空間換時間。函數
很久沒認真寫過C程序了,指針寫的各類不熟練。3d
代碼以下(GCC編譯,運行經過);指針
#include "stdio.h" #include "stdlib.h" #define MAX_SIZE 10 typedef struct { int top;//棧頂指針 int maxsize;//棧的最大容量 int *stack;//數組,存放棧內元素 int *min_index;//存放當前最小值下標 }ElemST; void InitStack(ElemST *s,int ms); void Push(ElemST *s,int val); int Pop(ElemST *s); int GetMinVal(ElemST *s); int main(void) { ElemST s; int i,tmp; InitStack(&s,10); srand((unsigned)time(NULL));//隨機數種子 for(i = 0;i<MAX_SIZE;++i)//產生隨機數,壓棧 { tmp = rand()%101; Push(&s,tmp); if(rand()%2)//隨機判斷是否出棧 Pop(&s); } printf("Min Val is %d\n",GetMinVal(&s)); return 0; } void InitStack(ElemST *s,int ms) { s->maxsize = ms; s->top = -1; s->stack = (int *)malloc(s->maxsize * sizeof(int)); s->min_index = (int *)malloc(s->maxsize * sizeof(int)); } void Push(ElemST *s,int val) { if(s->top +1 == s->maxsize) { printf("stack full,close..."); exit(0); } s->stack[++s->top] = val;//壓棧 if(s->top-1 == -1)//修改當前最小值下標 { s->min_index[s->top] = 0; } else if(val > s->stack[s->min_index[s->top -1]]) { s->min_index[s->top] = s->min_index[s->top -1]; } else { s->min_index[s->top] = s->top; } printf("%d已入...\n",val); } int Pop(ElemST *s) { s->top--; printf("%3d已出...\n",s->stack[s->top+1]); return s->stack[s->top+1]; } int GetMinVal(ElemST *s) { return s->stack[s->min_index[s->top]]; }
舉個例子演示上述代碼的運行過程: code
步驟 數據棧 輔助棧 (存小元素的位置) 最小值
1.push 3 3 0 3
2.push 4 3,4 0,0 3
3.push 2 3,4,2 0,0,2 2
4.push 1 3,4,2,1 0,0,2,3 1
5.pop 3,4,2 0,0,2 2
6.pop 3,4 0,0 3
it
7.push 0 3,4,0 0,0,2 0 io
參考資料:
編譯
《微軟面試100題系列》
來自互聯網其餘資料