1 题目要求
https://leetcode-cn.com/problems/min-stack/
2 算法思路
由于题目要求在常数时间内检索到最小的元素,那么我们一定要有一个变量,这个变量里面一直存储着现有栈中的最小的元素.
1.可以每次入栈两次,分别存储当前的栈中元素,和当前栈中的最小元素.弹栈操作和这个入栈操作正好对应,每次弹栈弹出两个元素.
2.可以在栈的数据结构中增加一项专门记录最小元素的变量值.
3 算法实现
这里主要是根据思路1进行了实现,由于栈的操作相对比较简单易懂,这里不再做过多的介绍.
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1600
typedef struct
{
int *data;
int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate()
{
MinStack *obj=(MinStack *)malloc(sizeof(MinStack));
obj->data=(int *)malloc(MAXSIZE*sizeof(int));
obj->top=-1;
return obj;
}
void minStackPush(MinStack* obj, int x)
{
if(obj->top==MAXSIZE-1){ }
else if(obj->top==-1)
{
obj->top++;
obj->data[obj->top]=x;
obj->top++;
obj->data[obj->top]=x;
}
else
{
int tmp=obj->data[obj->top];
obj->top++;
obj->data[obj->top]=x;
if(tmp<x)
{
obj->top++;
obj->data[obj->top]=tmp;
}
else
{
obj->top++;
obj->data[obj->top]=x;
}
}
}
void minStackPop(MinStack* obj)
{
if(obj->top==-1){ }
else
{
obj->top--;
obj->top--;
}
}
int minStackTop(MinStack* obj)
{
if(obj->top==-1)
{ return; }
return obj->data[obj->top-1];
}
int minStackGetMin(MinStack* obj)
{
return obj->data[obj->top];
}
void minStackFree(MinStack* obj)
{
free(obj->data);
obj->data=NULL;
free(obj);
obj=NULL;
}
/**
* 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 = minStackGetMin(obj);
* * minStackFree(obj);*/