设计包含min函数的栈

定义栈的数据结构,要求添加一个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题系列》

来自互联网其余资料

相关文章
相关标签/搜索