题目:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
方法1:
这种方法只能在线性时间内检索到最小元素,而不是常数时间内检索到最小元素,但是在leetcode中提交竟然也通过了。。。
准确的说,这种方法是不符合题意的。
typedef struct {
int a[10000];
int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *stk=malloc(sizeof(MinStack));
stk->top=0;
return stk;
}
void minStackPush(MinStack* obj, int x) {
obj->a[obj->top++]=x;
}
void minStackPop(MinStack* obj) {
--(obj->top);
}
int minStackTop(MinStack* obj) {
return obj->a[obj->top-1];
}
int minStackGetMin(MinStack* obj) {
int min=obj->a[0];
for(int i=1;i<obj->top;i++)
{
if(min>obj->a[i])
{
min=obj->a[i];
}
}
return min;
}
void minStackFree(MinStack* obj) {
free(obj);
}
方法2:
采用辅助栈。与存储元素的同步插入和删除,用于存储与每个元素对应的最小值。
当一个元素入栈时,取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中。
当一个元素出栈时,把辅助栈的栈顶元素也一并弹出。
在任何时候,栈内元素的最小值就存储在辅助栈的栈顶元素中。
typedef struct {
int num[10000];//数据栈
int sed[10000];//辅助栈
int top; //top指向栈顶元素的上面
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *stk=malloc(sizeof(MinStack));
if(stk==NULL) //如果内存分配不成功,就返回
stk->top=0;
return stk;
}
void minStackPush(MinStack* obj, int x) {
obj->num[obj->top]=x; //将数据x入数据栈
if(obj->top==0) //当前栈为空,直接将数据x入辅助栈
{
obj->sed[obj->top++]=x;
}
else if(x<=obj->sed[obj->top-1]) //如果x小于等于辅助栈栈顶元素,将x入辅助栈
{
obj->sed[obj->top]=x;
obj->top++;
}
else //否则x入栈前辅助栈栈顶的最小值仍然是x入栈后的最小值,所以将当前辅助栈栈顶的最小值再次入辅助栈
{
obj->sed[obj->top]=obj->sed[obj->top-1];
obj->top++;
}
}
void minStackPop(MinStack* obj) {
(obj->top)--;
}
int minStackTop(MinStack* obj) {
return obj->num[obj->top-1];
}
int minStackGetMin(MinStack* obj) {
return obj->sed[obj->top-1];
}
void minStackFree(MinStack* obj) {
free(obj);
}