一开始想的是用另外一个变量来遍历栈内元素,康康谁最小(就是//里的内容)。但是编译出错了,说明栈内的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刷题也太累了。