155.最小栈下的共享栈的运用

一开始想的是用另外一个变量来遍历栈内元素,康康谁最小(就是//里的内容)。但是编译出错了,说明栈内的top虽然是伪指针,依然不能像数组一样遍历栈内每一个元素。

之后想用两个栈,一个数据栈一个存当前栈中的最小数,但接口只能接一个栈。最后兜兜转,划零为整用了共享栈,两个栈放入一个栈里。

共享栈:存入第一个数时,数据与最小栈一起存入。
存入其他数时,先存到数据栈里,然后存当前数据栈里面最小的数到最小栈里。出栈时两个栈一起出,保证两个栈内元素数相等。

typedef struct {
    int data[10000];
    int top;   //数据栈
    int topm;  //最小栈
    int m;
} MinStack;

MinStack* minStackCreate(){
    MinStack *obj=(MinStack*)malloc(sizeof(MinStack));
    obj->top=-1;
    obj->topm=10000;
    return obj;
}

void minStackPush(MinStack* obj, int x) {
    if(obj->top==-1){//第一次存入数
        obj->topm--;
        obj->data[obj->topm]=x;
        obj->top++;
        obj->data[obj->top]=x;
    }
    else{				//其他数
            if(obj->data[obj->topm]>x){//存入的数是当前栈内最小的数时
                obj->topm--;
                obj->data[obj->topm]=x;
                obj->top++;
                obj->data[obj->top]=x;
            } 
            else{ 	//不是最小的就让最小栈存入之前最小的	
                obj->m=obj->data[obj->topm];  
                obj->topm--;
                obj->data[obj->topm]=obj->m;
                obj->top++;
                obj->data[obj->top]=x;
            }
    }   
}

void minStackPop(MinStack* obj) { //出栈
    obj->top-=1;
    obj->topm+=1;
}

int minStackTop(MinStack* obj) { //返回栈顶元素
    if(obj->top==-1) return false;
    return obj->data[obj->top];
}

int minStackGetMin(MinStack* obj) { //返回栈内最小数
    
    // int n=obj->data[obj->top];
    // if(obj->top==-1) return false;
    // for(int i=obj->top;i>0;i--){
    //     if(obj->data[i]<obj->data[i-1])
    //         n=obj->data[i-1];
    // }
    return obj->data[obj->topm];
}

void minStackFree(MinStack* obj) {
    free(obj);
}

最后,用C刷题也太累了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值