利用链表创建一个动态栈,并进行初始化、压栈、出栈、清空、判断是否为空栈的操作。

#include<iostream>//构建栈并且进行压栈出栈操作
using namespace std;
typedef struct Node//构建链表结点结构体类型
{
	int data;//一个链表结点的关键参数1是数据域的数据,这个数据可以很复杂,这里以存放一个整数为例
	struct Node* pNext;//一个链表结点的关键参数2是指针域,即存放下一个结点地址的指针变量
}NODE,*PNODE;//NODE是给struct Node结构体类型起一个短一点的类型名字,即NODE等价于struct Node,*PNODE等价于struct Node*

typedef struct Stack//构建栈结构体类型
{
	PNODE pTop;//栈的关键参数1是栈顶结点地址,即需要一个节点类型的指针指向栈顶结点
	PNODE pBottom;//栈的关键参数2是栈底部的头结点
}STACK, * PSTACK;

void init(PSTACK pStack)//对栈进行初始化
{
	PNODE p = (PNODE)malloc(sizeof(NODE));//产生一个结点作为不存放有效数据的头结点,目的是为了方便操作链表,即方便操作栈结点
	pStack->pBottom = p;//动态分配的结点内存地址赋给头指针
	pStack->pTop = p;//动态分配的结点内存地址赋给栈顶结点指针
	pStack->pTop->pNext = NULL;//栈顶结点的指针域初始化为NULL,因为不知道它指向哪个结点
}
void push(PSTACK pStack, int val)//压栈
{
	PNODE p = (PNODE)malloc(sizeof(NODE));//动态分配一个结点内存
	if (p == NULL)//动态内存分配失败
	{
		cout << "动态内存分配失败" << endl;
		exit(-1);//直接终止程序
	}
	p->data = val;//将压入栈的变量值给新节点的数据域
	p->pNext = pStack->pTop;//新结点的指针域存放的是栈顶结点的地址
	pStack->pTop = p;//新节点的地址就是栈顶结点的地址
}
bool is_emp(PSTACK pStack)//判断栈是否为空栈
{
	if (pStack->pTop == pStack->pBottom)//当指向栈顶和栈底的指针相等时,就是空栈
		return true;
	else
		return false;
}


void traverse(PSTACK pStack)//遍历栈元素
{
	PNODE p= pStack->pTop;
	while (pStack->pBottom != p)
	{
		cout << p->data<<"   " ;
		p = p->pNext;
	}
}

bool pop(PSTACK pStack, int* val)//出栈
{
	if (is_emp(pStack))//如果为空栈,就无元素可出栈
	{
		return false;
	}
	else
	{
		*val = pStack->pTop->data;//首先把出栈的结点数据保存
		PNODE r = pStack->pTop;//把要出栈的节点地址保存
		pStack->pTop = pStack->pTop->pNext;//栈顶结点指针下移
		free(r);//释放出栈结点的内存
		r = NULL;
		return true;
	}
}

void clear(PSTACK pStack)//释放栈内存,而不是仅让栈结点的数据域无效
{
	if (is_emp(pStack))
		return;
	else
	{
		while (pStack->pTop != pStack->pBottom)
		{
			PNODE r = pStack->pTop;
			pStack->pTop = pStack->pTop->pNext;
			free(r);
			r = NULL;
		}
		pStack->pTop = pStack->pBottom;
		//cout << "hahaha";
	}
}
int main()//测试
{
	int val;
	PSTACK pst=(PSTACK)malloc(sizeof(STACK));//指向一个栈
	init(pst);
	push(pst, 1);
	push(pst, 2);
	push(pst, 3);
	push(pst, 4);
	push(pst, 5);
	push(pst, 6);
	traverse(pst);
	for (int i = 0;i < 6;i++)
	{
		if (pop(pst, &val))
		{
			cout << "出栈的元素是:" << val << endl;
		}
		else
			cout << "出栈失败" << endl;
	}
	clear(pst);
	traverse(pst);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值