数据结构_链栈

数据结构_链栈

采用链式存储的栈成为链栈,这里采用单链表实现。链栈的优点是不存在栈满上溢的情况。规定栈的所有操作都在表头进行。
链栈中数据节点的类型 LiStack定义如下:

typedef struct linknode
{
	ElemType data;            //数据域
	struct linknode*next;     //指针域
}LiStack;                     //定义栈类型

(1)初始化栈 InitStack(s)。
建立一个空栈s,实际上是创建链栈的头结点,并将其next域置为NULL。

void IntiStack(LiStack * &s)
{
	s=(LiStack*)malloc(sizeof(LiStack));
	s->next = NULL;
}

(2)销毁栈 DestoryStack(s)。
释放s占用的全部储存空间。

void DestoryStack(LiStack * &s)
{
	LiStack *p=s,*q=s->next;
	while(q!=NULL)
	{
		free(p);
		p=q;
		q=p->next; 
	}
	free(p);                //此时p指向为节点
}

(3)判断栈是否为空 StackEmpty(s)。

bool StackEmpty(LiStack * s)
{
	return(s->next == NULL);
}

(4)进栈 Push(s,e)。
将数据节点插入到头结点之后。

void Push(LiStack * &s,ElemType e)
{
	LiStack *p;
	p=(LiStack*)malloc(sizeof(LiStack));
	p->data = e;
	p->next = s->next ;
	s->next = p;
}

(5)出栈Pop(s,e)。
在栈不为空的情况下,将头节点的指针域所指数据节点的数据赋值给e,然后将该数据节点删除。

bool Pop(LiStack *s,ElemType &e)
{
	LiStack *p;
	if(s->next == NULL)     //在栈为空的情况
		return false;
	p=s->next ;             //p指向开始节点
	e=p->data;
	s->next = p->next ;     //删除p节点
	free(p);                //释放p节点
	return true;
}

(6)获取栈顶元素 GepTop(s)。

bool GetTop(LiStack * s,ElemType e)
{
	if(s->next == NULL)
		return false;
	e=s->next -> data;
	return true;
}

例题:

#include<stdio.h>
#include<Windows.h>

typedef int ElemType;
typedef struct linknode
{
	ElemType data;            //数据域
	struct linknode*next;     //指针域
}LiStack;  //定义栈类型

void InitStack(LiStack * &s)
{
	s=(LiStack*)malloc(sizeof(LiStack));
	s->next = NULL;
}



void DestoryStack(LiStack * &s)
{
	LiStack *p=s,*q=s->next;
	while(q!=NULL)
	{
		free(p);
		p=q;
		q=p->next; 
	}
	free(p);                //此时p指向为节点
}


bool StackEmpty(LiStack * s)
{
	return(s->next == NULL);
}

void Push(LiStack * &s,ElemType e)
{
	LiStack *p;
	p=(LiStack*)malloc(sizeof(LiStack));
	p->data = e;
	p->next = s->next ;
	s->next = p;
}

bool Pop(LiStack *s,ElemType &e)
{
	LiStack *p;
	if(s->next == NULL)     //在栈为空的情况
		return false;
	p=s->next ;             //p指向开始节点
	e=p->data;
	s->next = p->next ;     //删除p节点
	free(p);                //释放p节点
	return true;
}

bool GetTop(LiStack * s,ElemType e)
{
	if(s->next == NULL)
		return false;
	e=s->next -> data;
	return true;
}
void print(LiStack * &s)
{
	int e;
	while(s->next != NULL)
	{
		Pop(s,e);
		printf("%d  ",e);
	}
}

int main()
{
	LiStack *p;
	InitStack(p);
	Push(p,2);
	Push(p,5);
	print(p);
	system("pause");
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值