定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
算法:在栈中设置一个辅助栈来保存最小值
代码:
/**
为栈增加一个min函数,获取栈中的最小值,复杂度为1
** author :xiaozhi xiong
** date:2014-02-08
**/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int MAX_STACK=50;
struct stack
{
int a[50];
int min[50 ];
int top;
int top_min;
};
//初始化栈
void InitStack(struct stack *p)
{
p->top=-1;
p->top_min=-1;
}
//入栈
void PushStack(struct stack* p,int value)
{
if(p->top>MAX_STACK)
{
printf("栈满\n");
return;
}
else
{
if(p->top_min==-1)
{
p->a[++p->top]=value;
p->min[++p->top_min]=value;
}
else
{
p->a[++p->top]=value;
if(p->min[p->top_min]>=value)
p->min[++p->top_min]=value;
}
}
}
int PopStack(struct stack *p)
{
int value;
if(p->top==-1)
{
printf("空栈\n");
return -999;
}
else
{
value=p->a[p->top];
p->a[p->top--];
if(value==p->min[p->top_min])
{
p->top_min--;
}
return value;
}
}
int GetMinInStack(struct stack *p)
{
if(p->top_min==-1)
{
printf("空栈\n");
return -9999;
}
else
{
return p->min[p->top_min];
}
}
int main(void)
{
struct stack *stack_min;
int popValue;
int minInStack;
stack_min=(struct stack *)malloc(sizeof(struct stack *));
InitStack(stack_min);
PushStack(stack_min,10);
PushStack(stack_min,1);
PushStack(stack_min,101);
PushStack(stack_min,-1);
PushStack(stack_min,-2);
PushStack(stack_min,-3);
popValue=PopStack(stack_min);
minInStack=GetMinInStack(stack_min);
printf("出栈%d 栈中最小值%d\n",popValue,minInStack);
popValue=PopStack(stack_min);
minInStack=GetMinInStack(stack_min);
printf("出栈%d 栈中最小值%d\n",popValue,minInStack);
popValue=PopStack(stack_min);
minInStack=GetMinInStack(stack_min);
printf("出栈%d 栈中最小值%d\n",popValue,minInStack);
getchar();
return 0;
}