155.最小栈

题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例

155.最小栈_第1张图片

思路

申请辅助栈无非是保持最小值,但是还需要申请额外空间

居然都是栈,并且都是为了保持数值,为什么不能和辅助栈合在一起呢,一个保存值,一个保存最小值

这样子就不需要额外申请空间,而且保存的最小值是全栈最小值,再有数据来时,只需要和最小值比较一下能得大最小值

效率也提高了

具体实现:

先申请一个头结点指针,保存位置,并不存储数据

每次来数据就申请一个空间,并将其插入到头节点位置

同时比较一下和下一个节点的最小值谁更小,并保存

如果是第一个数据节点,那么最小值就是val

代码

typedef struct MinStack{
    int data;
    int min;
    struct MinStack *next;
} MinStack;

/** initialize your data structure here. */
//我们申请了一个头结点,只是保存位置,并不会存储数据,所以每次操作数据时,都应该obj->next
MinStack* minStackCreate() {
    MinStack *S = (MinStack*)malloc(sizeof(MinStack));  //为头指针分配空间
    S->data = 0;                                        //初始化
    S->min = 0;
    S->next = NULL;
    return S;
}

//这里可能有点难理解,我们是创造了一个向下的栈,所以obj->next就是第一个最新插入的数据,越往下插入越长obj->next == NULL说明没有数据,或者是到了尾结点,因为我们在操作的时候obj是永远指向头结点的
void minStackPush(MinStack* obj, int val) 
{
    MinStack *s = (MinStack*)malloc(sizeof(MinStack));  //分配空间
    s->data = val;
    if(obj->next)
    {
        if(obj->next->min > val)
        {
            s->min = val;
        }
        else
        {
            s->min = obj->next->min;
        }
    }
    else
    {
        s->min = val;
    }
    s->next = obj->next;
    obj->next = s;
}

void minStackPop(MinStack* obj) {
    MinStack *s;                                        //s为栈顶指针
    if(obj->next == NULL)                               //栈空
        return ;
    s = obj->next;
    obj->next = s->next;
    free(s);                                            //释放空间
}

int minStackTop(MinStack* obj) {
    return obj->next->data;
}

int minStackGetMin(MinStack* obj) {
    return obj->next->min;
}

void minStackFree(MinStack* obj) {                      //释放空间
    MinStack *p = obj;
    MinStack *s;
    while(p != NULL){
        s = p->next;
        free(p);
        p = s;
    }
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, val);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackGetMin(obj);
 
 * minStackFree(obj);
*/

时间空间复杂度

155.最小栈_第2张图片

你可能感兴趣的:(LeetCode刷题笔记,算法,数据结构,c语言)