题目描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
实现代码如下:
typedef struct {
int *arr;//模拟栈的存储空间
int arrSize;//当前栈已经使用的空间
int min;//当前栈中最小的元素
int arrMaxSize;//指定栈空间大小
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate(int maxSize) {
MinStack* myStack=(MinStack*)malloc(sizeof(MinStack));//动态分配栈空间
myStack->arr=(int *)malloc(sizeof(int)*maxSize);//动态分配栈的数据空间
myStack->arrSize=0;//新栈默认为空
myStack->min=0;//初始化栈的最小值
myStack->arrMaxSize=maxSize;//初始化栈的最大容量
return myStack;
}
void minStackPush(MinStack* obj, int x) {
if((obj==NULL)||((obj->arrSize)==(obj->arrMaxSize)))//边界值判断:防止指向的栈为空,或者栈的使用空间已满
{
return;
}
obj->arr[obj->arrSize]=x;
(obj->arrSize)++;
if((obj->arrSize)==1)//计算栈中最小的元素
{
obj->min=x;
}
else
{
obj->min=(obj->min)>x?x:(obj->min);
}
}
void minStackPop(MinStack* obj) {
if((obj==NULL)||(obj->arrSize)==0)//边界值判断:防止指针指向的栈为空,或者栈存储内容为空
{
return;
}
(obj->arrSize)--;//pop操作之后,栈存储内容减少
int i=0;
obj->min=obj->arr[0];//pop之后无法判断栈当前最小元素,需要遍历一遍栈中元素,找出最小值
for(i=0;i<(obj->arrSize);i++)
{
if(obj->arr[i]<obj->min)
{
obj->min=obj->arr[i];
}
}
}
int minStackTop(MinStack* obj) {
if((obj==NULL) || (obj->arrSize==0))//边界值判断
{
return 0;
}
return obj->arr[obj->arrSize-1];
}
int minStackGetMin(MinStack* obj) {
if((obj==NULL) || (obj->arrSize==0))//边界值判断
{
return 0;
}
return obj->min;
}
void minStackFree(MinStack* obj) {
if(obj==NULL)//指针是否为空判断
{
return;
}
free(obj->arr);
free(obj);
}
/**
* Your MinStack struct will be instantiated and called as such:
* struct MinStack* obj = minStackCreate(maxSize);
* minStackPush(obj, x);
* minStackPop(obj);
* int param_3 = minStackTop(obj);
* int param_4 = minStackGetMin(obj);
* minStackFree(obj);
*/