【leetcode】最小棧
阿新 • • 發佈:2019-01-03
題目描述
設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。
- push(x) -- 將元素 x 推入棧中。
- pop() -- 刪除棧頂的元素。
- top() -- 獲取棧頂元素。
- getMin() -- 檢索棧中的最小元素。
示例
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
實現程式碼如下:
typedef struct { int *arr;//模擬棧的儲存空間 int arrSize;//當前棧已經使用的空間 int min;//當前棧中最小的元素 int arrMaxSize;//指定棧空間大小 } MinStack; /** initialize your data structure here. */ MinStack* minStackCreate(int maxSize) { MinStack* myStack=(MinStack*)malloc(sizeof(MinStack));//動態分配棧空間 myStack->arr=(int *)malloc(sizeof(int)*maxSize);//動態分配棧的資料空間 myStack->arrSize=0;//新棧預設為空 myStack->min=0;//初始化棧的最小值 myStack->arrMaxSize=maxSize;//初始化棧的最大容量 return myStack; } void minStackPush(MinStack* obj, int x) { if((obj==NULL)||((obj->arrSize)==(obj->arrMaxSize)))//邊界值判斷:防止指向的棧為空,或者棧的使用空間已滿 { return; } obj->arr[obj->arrSize]=x; (obj->arrSize)++; if((obj->arrSize)==1)//計算棧中最小的元素 { obj->min=x; } else { obj->min=(obj->min)>x?x:(obj->min); } } void minStackPop(MinStack* obj) { if((obj==NULL)||(obj->arrSize)==0)//邊界值判斷:防止指標指向的棧為空,或者棧儲存內容為空 { return; } (obj->arrSize)--;//pop操作之後,棧儲存內容減少 int i=0; obj->min=obj->arr[0];//pop之後無法判斷棧當前最小元素,需要遍歷一遍棧中元素,找出最小值 for(i=0;i<(obj->arrSize);i++) { if(obj->arr[i]<obj->min) { obj->min=obj->arr[i]; } } } int minStackTop(MinStack* obj) { if((obj==NULL) || (obj->arrSize==0))//邊界值判斷 { return 0; } return obj->arr[obj->arrSize-1]; } int minStackGetMin(MinStack* obj) { if((obj==NULL) || (obj->arrSize==0))//邊界值判斷 { return 0; } return obj->min; } void minStackFree(MinStack* obj) { if(obj==NULL)//指標是否為空判斷 { return; } free(obj->arr); free(obj); } /** * Your MinStack struct will be instantiated and called as such: * struct MinStack* obj = minStackCreate(maxSize); * minStackPush(obj, x); * minStackPop(obj); * int param_3 = minStackTop(obj); * int param_4 = minStackGetMin(obj); * minStackFree(obj); */