定义栈的数据结构,要求添加一个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; }
时间: 2024-09-28 17:48:49