设计包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
#include<stdio.h> #include<stdlib.h> #define M 100 #define m 10 struct minStack{ int top; int tail; int *valueStack; int *indexStack; }; void InitStack(minStack& s){ s.top = 0; s.tail = 0; s.valueStack = (int*)malloc(sizeof(int)*M); s.indexStack = (int*)malloc(sizeof(int)*M); } void push(minStack*& s,int data){ if(s.top - s.tail >= M){ s.valueStack = (int*)realloc(s.valueStack,m); s.indexStack = (int*)realloc(s.indexStack,m); } if(!s.valueStack||!s.indexStack) return ; s.valueStack[s.top] = data; if(s.top == s.tail||min(s) > data) s.indexStack[s.top++] = s.top; else s.indexStack[s.top++] = s.indexStack[s.top-1]; } int min(minStack* s){ if(s.top - s.tail == 0) return 0; return s.valueStack[s.indexStack[s.top-1]]; } int pop(minStack& s){ if(s.top - s.tail == 0) return 0; return s.valueStack[--s.top]; } void DestoryStack(minStack s) free(s.valueStack); free(s.indexStack); } int main(){ minStack s; int data; printf("输入元素(0结束):\n"); scanf("%d",&data); while(data){ push(s,data); printf("最小元素:%d\n",min(s)); printf("输入元素(0结束):\n"); scanf("%d",&data); }
DestoryStack(s); return 0; }