【数据结构】栈的链表实现

栈的链表实现

在刚学习数据结构的时候,我们经常地会用到顺序栈,一个学弟问到我怎样用链表实现栈,下午花了一点时间,好久没有写过这个东西了传上来大家一起交流学习!



/*
	日期:2014-3-25
	作者:徐刘根
	名称:栈的链表实现
	环境:VC++
*/
#include<iostream.h>

typedef struct node
{
	int data;
	struct node *next;

}StackNode,*PStackNode;

typedef struct
{
	PStackNode top;

}LinkStack,*PLinkStack;

PLinkStack Init_LinkStack( )//初始化空栈无入口参数
{
	PLinkStack S=new LinkStack();
	if(S)
		S->top=NULL;
	cout<<"初始化成功"<<endl;
	return(S);
}

int Empty_LinkStack(PLinkStack S)//判断栈是否为空入口参数:顺序栈,返回值:0表示为空,1表示非空
{
	if(S->top==NULL)
	{
		cout<<"栈是空的"<<endl;
		return 1;
	}
	else 
	{
		cout<<"栈非空"<<endl;
		return 0;
	}
}

int  Push_LinkStack(PLinkStack S,int x)//在栈顶插入一新元素X入口参数为顺序栈返回值:1表示入栈成功0表示失败
{
	PStackNode p=new StackNode();
	if(!p)
	{
		cout<<"内存溢出"<<endl;
		return 0;
	}
	p->data=x;
	p->next=S->top;
	S->top=p;
	cout<<"入栈成功,入栈元素为:"<<p->data<<endl;
	return 1;
}

int Pop_LinkStack(PLinkStack S,int *x)//删除栈顶元素并保存在*X,入口参数:顺序栈,返回值1表示成功0表示失败
{
   
	PStackNode p;
	if(Empty_LinkStack(S))
	{
		cout<<"栈空,不能出栈"<<endl;
		return 0;
	}
	*x=S->top->data;
	p=S->top;
	cout<<"出栈元素为:"<<p->data<<endl;
	S->top=S->top->next;
	delete(p);
	cout<<"出栈成功"<<endl;
	return 1;
}

int GetTop_LinkStack(PLinkStack S,int *x)//取出栈顶元素,入口参数:顺序栈,被取出的元素指针。
{
	if(Empty_LinkStack(S))
	{
		cout<<"栈空"<<endl;
		return 0;
	}
	*x=S->top->data;
	cout<<"取栈顶元素为:"<<*x<<endl;
	return 1;
}

int Bianli_Seqstack(PLinkStack S)//遍历栈入口参数为顺序栈
{
	if(Empty_LinkStack(S))
	{
		cout<<"栈空,不能出栈"<<endl;
		return 0;
	}
	else
	{
		PStackNode p,q;
		cout<<"栈元素遍历为:"<<endl;
		if(S)
		{
				p=S->top;
			while(p)
			{
				cout<<"--------"<<p->data<<"-------"<<endl;
				q=p;
				p=p->next;		
			}
			
		}
	}
	return 1;
}

void Destory_LinkStack(PLinkStack *S)//销毁栈入口参数要销毁的顺序栈指针地址
{
	PStackNode p,q;
	if(*S)
	{
		p=(*S)->top;
		while(p)
		{
			q=p;
			p=p->next;
			delete(q);
		}
		delete(*S);
	}
	*S=NULL;
	cout<<"栈已经删除了"<<endl;
	return ;
}
void main()
{	
	PLinkStack S =NULL;
	int i;
	cout<<"-------栈的线性表操作------"<<endl;
	while(true)
	{
		
		cout<<"***************************"<<endl;
		cout<<"<1>--栈的初始化           <2>--入栈操作    "<<endl;
		cout<<"<3>--出栈操作             <4>--判断栈是否空"<<endl;
		cout<<"<5>--取出栈顶元素         <6>--遍历栈      "<<endl;
	    cout<<"<7>--销毁栈                                "<<endl;
		cout<<"请选择您的操作"<<endl;
		cin>>i;
        switch(i)
		{
			
			case 1:S=Init_LinkStack(); break;
			case 2:
				int x;
				cout<<"请输入您要插入的元素"<<endl;
				cin>>x;
				Push_LinkStack( S,x );break;
			case 3:
				Pop_LinkStack( S,&x);break;
			case 4:
				Empty_LinkStack(S);break;
			case 5:
				GetTop_LinkStack(S,&x);break;
			case 6:
				Bianli_Seqstack(S);break;
			case 7:
	     		Destory_LinkStack(&S);break;
			default:
				cout<<"输入操作不正确,请重新选择!"<<endl;break;
		}
	}
}



运行结果如下:

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...