/*
2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
*/
/*时间复杂度要求是O(1)所以遍历肯定不行。
一开始想通过一个min指针始终指向最小的一个,可是突然发现在pop的时候如果把min指向的一项给pop掉
了不就完了,可见只让一项保存这个最小值是行不通的。所以只能让所有在栈中的项都保存一个在该项压
入栈中时的最小值。
*/
#include<stdio.h>
#include<stdlib.h>
struct MinStackElem
{
int value;
int min;
};
typedef struct
{
struct MinStackElem *data;
int size;
int top;
}Stack,*MinStack;
int maxSize=10;
void StackInit(MinStack S)
{
if(maxSize <= 0)
exit(-1);
S->data=(struct MinStackElem*)malloc(sizeof(struct MinStackElem)*maxSize);
if(S->data==NULL)
exit(-1);
S->size=0;
S->top=0;
}
void Push(MinStack S,int val)
{
if(S->top==maxSize)
{
perror("stack is full");
exit(-1);
}
S->data[S->top].value=val;
if(S->top==0)
S->data[S->top].min=val;
else if(val < S->data[S->top-1].min)
{
S->data[S->top].min=val;
}
else
{
S->data[S->top].min=S->data[S->top-1].min;
}
(S->top)++;
(S->size)++;
}
void Pop(MinStack S)
{
if(S->top==0)
{
perror("stack is empty");
exit(-1);
}
(S->top)--;
(S->size)--;
}
void Min(MinStack S)
{
printf("%d\n",S->data[S->top-1].min);
}
void StackFree(MinStack S) {
free(S->data);
}
int main()
{
Stack S;
StackInit(&S);
Push(&S,10);
Min(&S);
Push(&S,7);
Min(&S);
Push(&S,3);
Min(&S);
Push(&S,3);
Min(&S);
Push(&S,8);
Min(&S);
Push(&S,5);
Min(&S);
Push(&S,2);
Min(&S);
Pop(&S);
Min(&S);
Pop(&S);
Min(&S);
Pop(&S);
Min(&S);
StackFree(&S);
}
设计包含min函数的栈
最新推荐文章于 2019-03-29 00:34:39 发布