定义栈的数据结构,要求添加一个min函数,可以获得栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。面试
分析:数组
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,若是该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:若是当前最小元素被pop出去,如何才能获得下一个最小元素?
所以仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。咱们须要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型多是复杂的数据结构,用最小元素的位置将能减小空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。 数据结构
简而概之——以空间换时间。函数
很久没认真写过C程序了,指针写的各类不熟练。3d
代码以下(GCC编译,运行经过);指针
#include "stdio.h" #include "stdlib.h" #define MAX_SIZE 10 typedef struct { int top;//栈顶指针 int maxsize;//栈的最大容量 int *stack;//数组,存放栈内元素 int *min_index;//存放当前最小值下标 }ElemST; void InitStack(ElemST *s,int ms); void Push(ElemST *s,int val); int Pop(ElemST *s); int GetMinVal(ElemST *s); int main(void) { ElemST s; int i,tmp; InitStack(&s,10); srand((unsigned)time(NULL));//随机数种子 for(i = 0;i<MAX_SIZE;++i)//产生随机数,压栈 { tmp = rand()%101; Push(&s,tmp); if(rand()%2)//随机判断是否出栈 Pop(&s); } printf("Min Val is %d\n",GetMinVal(&s)); return 0; } void InitStack(ElemST *s,int ms) { s->maxsize = ms; s->top = -1; s->stack = (int *)malloc(s->maxsize * sizeof(int)); s->min_index = (int *)malloc(s->maxsize * sizeof(int)); } void Push(ElemST *s,int val) { if(s->top +1 == s->maxsize) { printf("stack full,close..."); exit(0); } s->stack[++s->top] = val;//压栈 if(s->top-1 == -1)//修改当前最小值下标 { s->min_index[s->top] = 0; } else if(val > s->stack[s->min_index[s->top -1]]) { s->min_index[s->top] = s->min_index[s->top -1]; } else { s->min_index[s->top] = s->top; } printf("%d已入...\n",val); } int Pop(ElemST *s) { s->top--; printf("%3d已出...\n",s->stack[s->top+1]); return s->stack[s->top+1]; } int GetMinVal(ElemST *s) { return s->stack[s->min_index[s->top]]; }
举个例子演示上述代码的运行过程: code
步骤 数据栈 辅助栈 (存小元素的位置) 最小值
1.push 3 3 0 3
2.push 4 3,4 0,0 3
3.push 2 3,4,2 0,0,2 2
4.push 1 3,4,2,1 0,0,2,3 1
5.pop 3,4,2 0,0,2 2
6.pop 3,4 0,0 3
it
7.push 0 3,4,0 0,0,2 0 io
参考资料:
编译
《微软面试100题系列》
来自互联网其余资料