【C++】数据结构 栈的实现

本篇博客给大家带来的是用C++语言来实现数据结构的栈的实现!

🐟🐟文章专栏:数据结构

🚀🚀若有问题评论区下讨论,我会及时回答

❤❤欢迎大家点赞、收藏、分享!

今日思想:请再努力一下 为了想见的人 想成为的自己!

一、栈的定义

栈就像一个杯子(如上图),存储数据的时候,先进后出,例如:我们存储1、2数据时,1先存储进去然后再到2,如果我们把数据拿出来时,先拿到的是2。

二、栈的实现

我们怎么实现栈呢?链表是不可以的,因为链表先存储的数据也可以先拿出来,这不符合栈的性质,答案是数组,数组存储数据先存储的后拿出来,假如我们存储1、2、3、4,我们把1拿出来这时候2后面的数据整体往前挪动,时间复杂度为O(n).

栈的实现方法:栈的初始化、栈的销毁、入栈------栈顶、出栈------栈顶、拿栈顶的数据、判断栈是否为空、获取栈中有效的数据。

1、栈的初始化

我们先定义栈的结构体,代码实例:

cpp 复制代码
//stack.h
typedef int STDataType;
typedef struct Stack
{
	STDataType* arr;
	int top;//指向栈顶的结构
	int capacity;//容量
}ST;

栈的初始化,代码实例:

cpp 复制代码
//stack.h
//栈的初始化
void STInit(ST* ps);
cpp 复制代码
//stack.c
//栈的初始化
void STInit(ST* ps)
{
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}

2、栈的销毁

代码实例:

cpp 复制代码
//stack.h
//栈的销毁
void STDestroy(ST* ps);
cpp 复制代码
//stack.c
//栈的销毁
void STDestroy(ST* ps)
{
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}

3、入栈------栈顶

一个栈假如我们栈里面什么都没有,此时top=capacity,要扩容,那么栈满了top=capcacity也要扩容。以上情况都考虑之后,我们看上图,把数据存储进去只要把数据放到top++就行。

代码实例:

cpp 复制代码
//stack.h
//入栈-栈顶
void StackPush(ST* ps, STDataType* x);
cpp 复制代码
//stack.c
//入栈-栈顶
void StackPush(ST* ps, STDataType* x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		//空间不够-增容
		int newCapacity = ps->capacity == 0 ? 4 : 2*ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	//空间够了
	ps->arr[ps->top++] = x;
}

4、判断栈是否为空

代码实例:

cpp 复制代码
//判断栈是否为空
bool StackEmpty(ST* ps);
cpp 复制代码
//stack.c
//判断栈是否为空
bool StackEmpty(ST* ps)
{
	asseret(ps);
	return ps->top == 0;
}

5、出栈------栈顶

出栈只要top--就行,这样我们入栈的时候覆盖原来的数据top++。

代码实例:

cpp 复制代码
//stack.h
//出栈-栈顶
void StackPop(ST* ps);
cpp 复制代码
//stack.c
//出栈-栈顶
void StackPop(ST* ps)
{
	assert(!StackEmpty(ps));
	--ps->top;
}

6、拿栈顶的数据

怎么拿栈顶的数据一看上图就知道了 。

代码实例:

cpp 复制代码
//stack.h
//拿栈顶的数据
STDataType StackTop(ST* ps);
cpp 复制代码
//stack.c
//拿栈顶的数据
STDataType StackTop(ST* ps)
{
	assert(!StackEmpty(ps));
	return ps->arr[ps->top - 1];
}

7、获取栈中有效数据

获取栈中有效数据其实就是存储了多少个数据。

代码实例:

cpp 复制代码
//stack.h
//获取栈中有效数据
int STSize(ST* ps);
cpp 复制代码
//stack.c
//获取栈中有效数据
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

完!!

相关推荐
yuniko-n4 小时前
【JUC】JMM(Java 内存模型)
java·开发语言
General_G5 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx5 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
Elastic 中国社区官方博客5 小时前
Observability:当 YAML 遇上 IConfiguration:OpenTelemetry .NET SDK 的声明式配置
大数据·开发语言·elasticsearch·搜索引擎·全文检索·.net
郑州光合科技余经理5 小时前
同城商城源码:商品库和订单库怎么随包交付
android·java·开发语言·后端·uni-app·php·ai编程
welfare9625 小时前
新号别搞:C++_list
开发语言·c++
数据狐(Datafox)5 小时前
一文读懂京东商品详情 API:返回字段解读与 JSON 样例
开发语言·数据库·爬虫·json
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖5 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
damoluomu5 小时前
国产 Java CMS 的协议和坑,讲清楚
java·开发语言