設計包含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題系列》

來自互聯網其餘資料

相關文章
相關標籤/搜索