欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-26 14:42:32
栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来。 push,对应入电梯,把数据往里面压 pop, 对应出电梯,把数据往外拿 栈顶,对应电梯门口 栈底,对应电梯最深处 这里使用链表实现栈。 先创 ......

栈:先入后出,后入先出

像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口,
所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来。

  • 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);
*/