0
点赞
收藏
分享

微信扫一扫

剑指Offer:[第1天 栈与队列(简单)]--->包含min函数的栈

您好 2022-02-15 阅读 55

文章目录


一、题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O ( 1 ) \rm{O(1)} O(1)

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();      --> 返回-3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();      --> 返回-2.

提示:
各函数的调用总次数不超过 20000 次


二、思路分析

注:思路分析中的一些内容和图片参考自力扣各位前辈,感谢他们的无私奉献

分析

函数设计


三、整体代码

整体代码如下

#define N 20000

//创建两个栈,栈1用于正常的入栈出栈操作,栈2用于将栈1的最小元素防在栈顶
typedef struct {
    int *Stack1;
    int *Stack2;
    int top1;
    int top2;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* MS=(MinStack*)malloc(sizeof(MinStack));
    MS->Stack1 = (int*)malloc(sizeof(int)*N);
    MS->Stack2 = (int*)malloc(sizeof(int)*N);
    MS->top1 = -1;
    MS->top2 = -1;
    return MS;
}

void minStackPush(MinStack* obj, int x) {
    obj->Stack1[++obj->top1] = x; //栈1正常入栈
    if(obj->top2 == -1){   //如果栈2是空的
        obj->Stack2[++obj->top2] = x; //将x也压入栈2
    }
    else{
        //如果栈2不空,同时x<=栈2的栈顶元素
        if(x <= obj->Stack2[obj->top2]){
            //将x压入栈2的栈顶
            obj->Stack2[++obj->top2] = x;
        }
    }

}

void minStackPop(MinStack* obj) {
    //保存栈1的栈顶元素,同时top1-1
    int a = obj->Stack1[obj->top1];
    obj->top1--;
    //如果栈1的栈顶元素等于栈2的栈顶元素,则将栈2的栈顶元素弹出,top2-1
    if(a==obj->Stack2[obj->top2]){
        obj->top2--;
    }
}

//正常返回栈1的栈顶元素即可
int minStackTop(MinStack* obj) {
    return obj->Stack1[obj->top1];
}

//正常返回栈2的栈顶元素即可
int minStackMin(MinStack* obj) {
    return obj->Stack2[obj->top2];
}

void minStackFree(MinStack* obj) {
    free(obj->Stack1);
    free(obj->Stack2);
    free(obj);
}

/**
 * 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 = minStackMin(obj);
 
 * minStackFree(obj);
*/

运行,验证通过
在这里插入图片描述

举报

相关推荐

0 条评论