解法1:构造合适的数据结构
根据题意,构造合适的数据结构,一个Data是一个栈元素,其中val是当前栈的数值元素,prim_min记录的是当前栈之前所有数值元素的最小值,若需要知道当前元素的最小值,只需要求得min(val, prim_min)即可。
构造数据结构时,用时需要仔细区分->和.来正确访问元素。
#define N 10000
#define Min(x,y) ((x)<(y)?(x):(y))
typedef struct { //构造合适的数据结构
int val; //当前栈元素
int prim_min; //原来栈中最小值
} Data;
typedef struct {
Data * data;
int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *obj = (MinStack *)calloc(1, sizeof(MinStack));
obj->data = (Data *)calloc(N, sizeof(Data));
obj->top = -1;
return obj;
}
void minStackPush(MinStack* obj, int x) {
Data tmp;
tmp.val = x;
if (obj->top == -1)
tmp.prim_min = x;
else
tmp.prim_min = Min((obj->data[obj->top]).prim_min, x);
obj->top++;
obj->data[obj->top] = tmp;
}
void minStackPop(MinStack* obj) {
if (obj->top > -1)
obj->top--;
else
printf("stack error!\n");
}
int minStackTop(MinStack* obj) {
return obj->data[obj->top].val;
}
int minStackMin(MinStack* obj) {
return obj->data[obj->top].prim_min;
}
void minStackFree(MinStack* obj) {
free(obj->data);
free(obj);
}
解法2:每次压栈两次,一次是数值,一次是之前元素的最小值
#define N 20000
#define Min(x,y) ((x)<(y)?(x):(y))
typedef struct {
int* data;
int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *obj = (MinStack *)calloc(1, sizeof(MinStack));
obj->data = (int *)calloc(N, sizeof(int));
obj->top = -1;
return obj;
}
void minStackPush(MinStack* obj, int x) {
if (obj->top == -1) {
obj->data[++obj->top] = x;
obj->data[++obj->top] = x;
} else {
obj->data[++obj->top] = x;
obj->data[++obj->top] = Min(x, obj->data[obj->top - 1]);
}
}
void minStackPop(MinStack* obj) {
if (obj->top > -1)
obj->top -= 2;
else
printf("stack error!\n");
}
int minStackTop(MinStack* obj) {
return obj->data[obj->top - 1];
}
int minStackMin(MinStack* obj) {
return obj->data[obj->top];
}
void minStackFree(MinStack* obj) {
free(obj->data);
free(obj);
}