数据结构模板之五:链栈

①基本定义

采用链式存储结构的栈称为链栈和顺序栈相比,链栈的优点是不存在栈满上溢出的情况,有关顺序栈的内容可以点此查看。

②存储方式与结构

栈(a1,a2,...,an-1,an)

映射


③实现

顺序栈栈空的条件是s->top==-1,而链栈栈空的条件则是s->next=NULL。

#include <iostream>
#include <cstdio>
#define MaxSize 50
typedef int ElemType;

typedef struct linknode
{
	ElemType data;               //数据域
	linknode *next;              //指针域
}LinkStNode;                     //链域结点类型  

/*****初始化栈*****/
void InitStack(LinkStNode * &s)
{
	s=(LinkStNode *)malloc(sizeof(LinkStNode));
	s->next==NULL;
}

/*****销毁栈*****/
void DestroyStack(LinkStNode * &s)
{
	LinkStNode *pre=s,*p=s->next;        //pre指向头结点,p指向首结点
	while(p!=NULL)                       //循环到p为空为止
	{
		free(pre);
		pre=p;                           //pre,p同步后移
		p=pre->next;
	}
	free(pre);                           //此时pre指向尾结点,释放其空间
}

/*****判断栈是否为空栈*****/
bool StackEmpty(LinkStNode *s)
{
	return (s->next==NULL);
}

/*****进栈*****/
void Push(LinkStNode * &s,ElemType e)
{
	LinkStNode *p;
	p=(LinkStNode *)malloc(sizeof(LinkStNode));
	p->data=e;
	p->next=s->next;                               //将p结点插入作为首结点
	s->next=p;
}

/*****出栈*****/
bool Pop(LinkStNode * &s,ElemType &e)
{
	LinkStNode *p;
	if(s->next==NULL)                              //栈空的情况
		return false;
	p=s->next;                                     //p指向首结点
	e=p->data;                                     //提取首结点值
	s->next=p->next;                               //删除首结点
	free(p);
	return true;
}

/*****取栈顶元素*****/
bool GetTop(LinkStNode *s,ElemType &e)
{
	if(s->next==NULL)                        //栈空的情况
		return false;
	e=s->next->data;                         //提取首结点值
	return true;
}

int main()
{
	return 0;
}
---代码和部分内容参考自《数据结构教程》

猜你喜欢

转载自blog.csdn.net/gsdxiaohei/article/details/80799940
今日推荐