C语言版本
#define MAX_STACK_SIZE 20000
typedef struct
{
int *main_stack; // 主栈,用于存放正常入栈的元素
int *min_value_stack; // 最小值栈,用于存放当前主栈的最小值
int top_main_stack; // 主栈栈顶
int top_min_value_stack; // 最小值栈栈顶
int min_value; // 最小值
} MinStack;
MinStack* minStackCreate()
{
MinStack *obj;
obj = (MinStack*)malloc(sizeof(MinStack));
if (obj == NULL)
{
return NULL;
}
obj->main_stack = (int*)malloc(MAX_STACK_SIZE * sizeof(int));
if (obj->main_stack == NULL)
{
free(obj);
return NULL;
}
obj->min_value_stack = (int*)malloc(MAX_STACK_SIZE * sizeof(int));
if (obj->min_value_stack == NULL)
{
free(obj);
return NULL;
}
obj->top_main_stack = -1;
obj->top_min_value_stack = -1;
obj->min_value = 0;
return obj;
}
void minStackPush(MinStack* obj, int x)
{
if (obj->top_main_stack < MAX_STACK_SIZE)
{
// // 主栈压入元素
// obj->main_stack[++obj->top_main_stack] = x;
// // 最小值栈压入元素
// if (obj->top_main_stack == -1)
// {
// obj->min_value = x; // 注意这个边界条件
// }
// else
// {
// if (x < obj->min_value)
// {
// obj->min_value = x;
// }
// }
// obj->min_value_stack[++obj->top_min_value_stack] = obj->min_value;
if (obj->top_main_stack == -1)
{
obj->min_value = x;
}
obj->main_stack[++obj->top_main_stack] = x;
if (x < obj->min_value)
{
obj->min_value = x;
}
obj->min_value_stack[++obj->top_min_value_stack] = obj->min_value;
}
}
void minStackPop(MinStack* obj)
{
if (obj->top_main_stack != -1)
{
--obj->top_main_stack;
}
if (obj->top_min_value_stack != -1)
{
--obj->top_min_value_stack;
// 注意最小值也要下移一位
if (obj->top_min_value_stack != -1)
{
obj->min_value = obj->min_value_stack[obj->top_min_value_stack];
}
}
}
int minStackTop(MinStack* obj)
{
return obj->main_stack[obj->top_main_stack];
}
int minStackMin(MinStack* obj)
{
return obj->min_value;
}
void minStackFree(MinStack* obj)
{
if (obj != NULL)
{
if (obj->main_stack != NULL)
{
free(obj->main_stack);
}
if (obj->min_value_stack != NULL)
{
free(obj->min_value_stack);
}
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);
*/