leadcode的Hot100系列--155. 最小棧

棧:先入後出,後入先出code

像電梯同樣,先進入電梯的,走到電梯最深處,後進入電梯的,站在電梯門口,
因此電梯打開的時候,後進入的會先走出來,先進入的會後走出來。it

  • push,對應入電梯,把數據往裏面壓
  • pop, 對應出電梯,把數據往外拿
  • 棧頂,對應電梯門口
  • 棧底,對應電梯最深處

這裏使用鏈表實現棧。
先建立一個MinStack頭,
入棧:直接把結構體掛在MinStack頭後面,
出棧:直接拿出MinStack頭後面的結構體。
取最小值:對鏈表進行一次遍歷,返回最小值。遍歷

typedef struct minstack{
    struct minstack *pNext;
    int val;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {             // 建立一個 minStack 頭
    MinStack *pstTemp = NULL;
    pstTemp = (MinStack *)calloc(1, sizeof(MinStack));
    if (NULL == pstTemp)
        return NULL;
    pstTemp->pNext = NULL;
    return pstTemp;
}

void minStackPush(MinStack* obj, int x) {    // 入棧
    MinStack *pstTemp = NULL;
    if (NULL == obj)
        return;
    pstTemp = (MinStack *)calloc(1, sizeof(MinStack));
    if (NULL == pstTemp)
        return;
    pstTemp->val = x;
    pstTemp->pNext = obj->pNext;
    obj->pNext = pstTemp;
    return;
}

void minStackPop(MinStack* obj) {      // 出棧
    MinStack *pstTemp = NULL;
    if ((NULL == obj) || (NULL == obj->pNext))
        return;
    pstTemp = obj->pNext;
    obj->pNext = pstTemp->pNext;
    free(pstTemp);
    pstTemp = NULL;
    return;
}

int minStackTop(MinStack* obj) {
    MinStack *pstTemp = NULL;
    if ((NULL == obj) || (NULL == obj->pNext))
        return;
    pstTemp = obj->pNext;
    return pstTemp->val;
}

int minStackGetMin(MinStack* obj) {
    MinStack *pstTemp = NULL;
    int iMin = 0;
    if ((NULL == obj) || (NULL == obj->pNext)) // 這裏若是確實是一個空鏈表的話,返回0的話好像也不太對
        return iMin;
    else
    {
        pstTemp = obj->pNext;
        iMin = pstTemp->val;   // 這裏須要使用棧裏面值初始化一下iMin,萬一棧裏面全部的值都大於0,就會返回最小值爲0,就錯了
        pstTemp = pstTemp->pNext;
    }
    while(NULL != pstTemp)
    {
        if (pstTemp->val < iMin)
            iMin = pstTemp->val;
        pstTemp = pstTemp->pNext;
    }
    return iMin;
}

void minStackFree(MinStack* obj) {
    MinStack *pstNow = NULL;
    MinStack *pstNext = NULL;
    if ((NULL == obj) || (NULL == obj->pNext))
        return;
    pstNow = obj->pNext;
    while(NULL != pstNow)
    {
        pstNext = pstNow->pNext;
        free(pstNow);
        pstNow = NULL;
        pstNow = pstNext;
    }
    return;
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, x);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackGetMin(obj);
 
 * minStackFree(obj);
*/
相關文章
相關標籤/搜索