栈的实现---超详细

本文详细介绍了栈的数据结构模型,包括栈的初始化、入栈、出栈、弹出栈顶、判断栈空和计算栈长度等操作的C++代码实现,并提供了测试用例。
摘要由CSDN通过智能技术生成

栈的实现

在这里插入图片描述

一、栈的模型

首先栈有两个概念
1.数据结构里的栈。2.语言/操作系统中的栈(内存空间),可能会在递归程序里发生栈溢出。
入栈和出栈只能发生在栈顶,栈底不进行任何操作,且栈顶随着入栈和出栈变化。栈顶指向最后的数据。
在这里插入图片描述

二、栈的代码实现以及测试用例

①栈的初始化

void STIni(ST* pst)
{
	assert(pst);//数组栈和顺序表比较像,注意顺序表和数组栈
	//是一块连续的内存空间,所以必须要这样实现
	pst->a = NULL;
	pst->capacity = 0;
	//top指向栈顶元素
	pst->top = -1;
	//top指向栈顶元素的下一个
	//pst->top = 0;
}

②入栈

void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->capacity == pst->top + 1)
	{
		int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("malloc");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top + 1] = x;
	pst->top += 1;
}

③出栈

void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > -1);
	/*free(pst->a[pst->top]);
	pst->a[pst->top] = NULL;*///不能随便free,数组栈连续,我还可以下次继续插回来。
	pst->top -= 1;
}

④弹出栈顶

STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > -1);
	return pst->a[pst->top];
}

⑤判断栈空间是否为空

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == -1;
}

⑥计算栈空间长度

int STSize(ST* pst)
{
	assert(pst);
	return (pst->top + 1);
}

⑦销毁栈

void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

⑧测试用例

#define _CRT_SECURE_NO_WARNINGS
#include "Stack.h"
void test1()
{
	ST s;
	STIni(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);
	STPush(&s, 4);
	STPush(&s, 5);
	while (!STEmpty(&s))
	{
		printf("%d ", STTop(&s));
		STPop(&s);
	}
	printf("\n");
}

int main()
{
	test1();
	return 0;
}

注意:想要打印栈必须使用这种方法,用是否为空来检验,进入循环后,再打印弹出的栈顶,之后每次弹出后,都要删除一次。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值