【练习】设计包含min 函数的栈

定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。

 

思路:在栈结点中增加一个指向当前栈最小值的指针。

 

  
#include <iostream>
#include <time.h>
using namespace std;
struct StackNode
{
	int value;
	StackNode *pNext;
	StackNode  *pMin;
} ;

typedef struct{
	StackNode *top;  //栈顶指针
}LinkStack;

void InitStack(LinkStack *S)
{
	S->top=NULL;

}

void push(LinkStack *S,int element);
int pop(LinkStack *S);
void Min(LinkStack *S);
void printStack(LinkStack *S);



int main()
{

	LinkStack  *s=new LinkStack();
	InitStack(s);
	srand((unsigned)time(NULL));
	for (int i=0;i<10;i++)
	{
		push(s,rand()%20);
	}
	Min(s);
	while(s->top!=NULL)
	{
		pop(s);
		Min(s);
	}

}

void push(LinkStack *S,int x)
{

	if (NULL==S->top)//栈为空时
	{
		StackNode *p=(StackNode *)malloc(sizeof(StackNode));
		p->value=x;
		p->pMin=p;
		p->pNext=S->top;//将新结点*p插入链栈头部
		S->top=p;
	}
	else
	{
		StackNode *p=(StackNode *)malloc(sizeof(StackNode));
		p->value=x;
		p->pMin=p;
/************************************************************************/
/* 使当前结点pMin始终指向当前栈中最小的值                                                                     */
		if (p->pMin->value<S->top->pMin->value)
		{

			p->pMin=p;
		}
		else
		{
			p->pMin=S->top->pMin;
		}
/************************************************************************/
		
		p->pNext=S->top;//将新结点*p插入链栈头部
		S->top=p;
	}
		
	

}

int pop(LinkStack *S)
{
	int x;
	StackNode *p=S->top;//保存栈顶指针
	x=p->value;  //保存栈顶结点数据
	S->top=p->pNext;  //将栈顶结点从链上摘下
	free(p);
	cout<<"pops "<<x<<endl;
	return x;
}

void Min(LinkStack *S)
{
	printStack(S);
	
	if (NULL!=S->top)
	{
		cout<<"current min value is:"<<S->top->pMin->value;
	} 
	else
	{
		cout<<"stack empty"<<endl;
	}
	cout<<endl;
	cout<<endl;
	
}

void printStack(LinkStack *S)
{
	
	if (S->top!=NULL)
	{
		cout<<"current stack is:"<<"  ";
		StackNode *p=S->top;

		while(NULL!=S->top)
		{
			cout<<S->top->value<<"    ";
			S->top=S->top->pNext;
		}
		S->top=p;
		cout<<endl;
	}
	else
	{
		cout<<"stack empty"<<endl;
	}
	
}

  

posted @ 2011-10-17 10:27  refazy  阅读(215)  评论(0编辑  收藏  举报