1. 程式人生 > >【leetcode】最小棧

【leetcode】最小棧

題目描述

設計一個支援 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);
 */