设计包含min函数的栈

来源:互联网 发布:添加网络节点 编辑:程序博客网 时间:2024/06/01 13:08
/*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);}

0 0
原创粉丝点击