我的数据结构学习之路(二)------栈

本文介绍了栈的概念及其基本操作,包括栈的初始化、入栈、出栈、遍历和清空等过程,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了栈的概念和其基本操作。自我认为,栈就是一种受限制的链表,通过头指针pTop和尾指针pBottom对栈进行出栈和入栈的操作。栈的思想是先入后出。

首先来介绍栈的创建,即栈的初始化。所谓栈的初始化,就是创建一个节点使得头指针和为指针都指向这个节点,并且这个节点和链表头指针一样没有任何数据。由此完成了栈的创建操作。

栈的创建代码为:

void init(PSTACK s)
{
	PNODE p=(PNODE)malloc(sizeof(NODE));
	if(p==NULL)
	{
		printf("内存分配失败\n");
		exit(-1);
	}
	else
	{
		s->pTop=p;
		s->pBottom=s->pTop;
		p->pNext=NULL;
	}
}
其次是入栈操作,即向栈添加数据。在添加数据的时候需要创建一个节点,为这个节点付给数据,并使这个节点指向之前的头节点,最后将这个节点设成新的头节点。由此完成入栈的操作。

栈的入栈代码为:

void push(PSTACK s,int val)
{
	PNODE p=(PNODE)malloc(sizeof(NODE));
	p->dat=val;
	p->pNext=s->pTop;
	s->pTop=p;
}
然后是出栈操作,即删除数据。由于栈遵循的是先入后出的概念,所以最先压入栈的元素一定是最后出栈的,最先出栈的元素是最后入栈的。首先创建一个节点,这个节点保存的是头指针指向的节点,然后将头指针指向下一个节点,并且释放创建的节点。由此则完成出栈的操作。
栈的出栈代码为:

bool pop(PSTACK s,int *pVal)
{
	PNODE p;
	if(s->pTop==s->pBottom)
		return false;
	else
	{
		p=s->pTop;
		*pVal=p->dat;
		s->pTop=p->pNext;
		free(p);
		return true;
	}
}
接着是栈的遍历,即输出栈的元素。创建一个节点首先保存头指针指向的节点,并做判断若此节点指针不等于尾指针,则输出节点数据,直到节点指针等于尾指针则终止循环。由此完成栈的遍历操作。

栈的遍历代码为:

void travel(PSTACK s)
{
	PNODE p;
	p=s->pTop;
	while(p!=s->pBottom)
	{
		printf("%d ",p->dat);
		p=p->pNext;
	}
	printf("\n");
}
最后是栈的清空,即删除所有栈的元素。这里我运用的是创建一个新节点指针,使它等于头指针,然后头指针指向下一个节点指针,并释放新的节点指针。直到头指针等于尾指针时结束循环。由此完成栈的清空操作。

栈的清空代码为:

void clear(PSTACK s)
{
	PNODE p;
	if(s->pBottom==s->pTop)
		printf("栈已空。\n");
	else
	{
		p=s->pTop;
		
		while(s->pTop!=s->pBottom)
		{
			s->pTop=p->pNext;
			free(p);
			p=s->pTop;
		}
		free(p);
		printf("栈已清空!\n");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值