包含min函数的最小栈
辅助栈
//栈中的元素组成,一个当前元素,一个当前最小值
typedef struct{
int data;
int min;
}element;
//栈
typedef struct {
element* elem;
element* top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* S = (MinStack*)malloc(sizeof(MinStack));
S->elem = (element*)malloc(sizeof(element)*20000);
S->top = S->elem;
return S;
}
void minStackPush(MinStack* obj, int x) {
//如果栈中为空,则第一个元素就是最小值
if(obj->top == obj->elem){
obj->top->min = x;
}
else{
//如果栈非空,则与原来最小元素比较
if((obj->top-1)->min > x){
obj->top->min = x;
}
else{
obj->top->min = (obj->top-1)->min;
}
}
obj->top->data = x;
obj->top++;
}
void minStackPop(MinStack* obj) {
obj->top--;
}
int minStackTop(MinStack* obj) {
return (obj->top-1)->data;
}
int minStackMin(MinStack* obj) {
return (obj->top-1)->min;
}
void minStackFree(MinStack* obj) {
free(obj->elem);
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时说明,当前元素小于最小元素,存储差值,并将当前元素作为最小元素。
当存储值大于等于0时,直接存储差值。
出栈时注意更新最小值
当 当前值小于0.最小值 = 最小值 - 当前栈顶存储值
当当前值大于等于0 不改变最小值。
取栈顶元素时,如果栈顶元素小于0,则栈顶元素 = 栈顶存储值 +当前最小值。
当栈顶元素大于等于0时,栈顶元素 = 当前最小值。
!!! 缺陷,应该算是c语言的缺陷,C语言int类型可能出现溢出,比如当前值为很大的负数,但是当前最小值为很大的整数,栈顶需要存储 大负数-大正数。极有可能会导致溢出。其他语言,比如python应该不会。
typedef struct {
long* data;
long* top;
long min;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* S = (MinStack*)malloc(sizeof(MinStack));
S->data = (long*)malloc(sizeof(long)*20000);
S->top = S->data;
return S;
}
void minStackPush(MinStack* obj, int x) {
if(obj->top == obj->data){
obj->min = x;
*obj->top++ = x-obj->min;
}
else{
*obj->top++ = x- obj->min;
if(x < obj->min){
obj->min = x;
}
}
}
void minStackPop(MinStack* obj) {
obj->top--;
if(*obj->top < 0){
obj->min = obj->min - *(obj->top);
}
}
int minStackTop(MinStack* obj) {
return (*(obj->top-1)<0) ? (obj->min) : (*(obj->top-1)+obj->min);
}
int minStackMin(MinStack* obj) {
return obj->min;
}
void minStackFree(MinStack* obj) {
free(obj->data);
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);
*/