栈和队列<数据结构 C版>

目录

栈(Stack)

栈的结构体

初始化

销毁

入栈

判空

出栈

取栈顶元素

获取栈个数

测试:

队列(Queue)

队列的结构体

单个结点

队列

初始化

销毁

入队列,队尾

判空

出队列,队头

取队头数据

取队尾数据(非标准操作)

获取队列个数

测试:


栈(Stack)

栈是一种特殊的线性表,其只允许在特定的一端进行插入和删除操作。

进行插入和删除操作的一端叫做栈顶

另一端称为栈底

栈中的数据元素遵循后进先出LIFO(Last In First Out )的原则

压栈:栈的插入操作也被称为进栈、入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈,出数据也在栈顶。

因为栈只在一端进行操作,所以栈的实现使用数组更加优越。


栈的结构体

//重命名,方便统一修改
typedef int STDataType;typedef struct stack {STDataType* arr;int capacity;//栈的容量int top;//栈顶位置(有效元素个数)
}ST;

初始化

//初始化
void STInit(ST* ps) {assert(ps);//不能传入NULLps->arr = NULL;ps->capacity = ps->top = 0;
}

销毁

//销毁
void STDestory(ST* ps) {assert(ps);//不能传入NULLif (ps->arr) {//防止对NULL指针的引用(即栈为空的情况)free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}

入栈

//入栈
void STPush(ST* ps, STDataType x) {assert(ps);if (ps->capacity == ps->top) {//若空间不足int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//若栈容量为0,给定初始值,否则以两倍大小增长STDataType* p = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (!p) {//申请失败,直接返回perror("realloc fail!");exit(1);}ps->arr = p;ps->capacity = newcapacity;//改变原容量大小}ps->arr[ps->top++] = x;//先给栈顶赋值,在加加
}

判空

//判空
bool STEmpty(ST* ps) {assert(ps);return ps->top == 0;//返回bool值,直接返回比较运算符的返回值
}

出栈

//出栈
void STPop(ST* ps) {assert(ps && !STEmpty(ps));//不能传入NULL && 栈为空ps->top--;//出栈,让栈顶减减
}

取栈顶元素

//取栈顶元素
STDataType STTop(ST* ps) {assert(ps && !STEmpty(ps));//不能传入NULL && 栈为空return ps->arr[ps->top - 1];//返回栈顶元素,让栈顶减减
}

获取栈个数

//获取栈有多少元素
int STSize(ST* ps) {assert(ps);return ps->top;//直接返回栈顶下标(即元素个数)
}

测试:


队列(Queue)

队列也是一种特殊的线性表,其在一端进行插入操作,另一端进行删除操作。

进行插入操作的一端叫做队尾(rear)。

进行删除操作的一端叫做队头(front)。

队列中的数据元素遵循后进先出FIFO(Frist In First Out )的原则

入队:队列的插入操作,一般发生在队尾

出队:队列的删除操作,一般发生在队头

因为队列在头部删除数据,使用数组,移动数据的时间复杂比较高,所以使用链表更优越。


队列的结构体

单个结点
//重命名,方便统一修改
typedef int QDataType;//队列单个结点结构
typedef struct QueueNode {QDataType data;//数据struct QueueNode* next;//下一个结点
}QN;
队列
//队列结构
typedef struct queue {QN* front;//队头QN* rear;//队尾int size;//结点数
}Q;

初始化

//初始化队列
void QueueInit(Q* pq) {assert(pq);pq->front = pq->rear = NULL;pq->size = 0;
}

销毁

//销毁
void QueueDestory(Q* pq) {assert(pq);assert(!QueueEmpty(pq));//队列为空,不用销毁QN* pcur = pq->front;while (pcur) {QN* next = pcur->next;free(pcur);//依次释放每一个结点pcur= next;}pq->rear = pq->front = NULL;//置队头队尾pq->size = 0;
}

入队列,队尾

//入队列,队尾
void QueuePush(Q* pq, QDataType x) {assert(pq);QN* node = (QN*)malloc(sizeof(QN));//开辟一个新结点if (!node) {//防止为空perror("malloc fail!");exit(1);}node->data = x;//data元素node->next = NULL;//next指针if (pq->front == NULL) {//若队列为空,队头队尾都要改变pq->front = pq->rear = node;}else {//若不为空,则改变尾结点指向pq->rear->next = node;pq->rear = node;}pq->size++;//队列元素++
}

判空

//判空
bool QueueEmpty(Q* pq) {assert(pq);return pq->size == 0;
}

出队列,队头

//出队列,队头
void QueuePop(Q* pq) {assert(pq);assert(!QueueEmpty(pq));//不能为空if (pq->front->next == NULL) {//若只有一个元素,队尾的指向也要发生改变free(pq->front);pq->front = pq->rear = NULL;}else {//若有多个元素,只用改变队头指向QN* del = pq->front;pq->front = pq->front->next;free(del);del = NULL;}pq->size--;
}

取队头数据

//取队头数据
QDataType QueueFront(Q* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->front->data;
}

取队尾数据(非标准操作)

//取队尾数据
QDataType QueueRear(Q* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->rear->data;
}

获取队列个数

//队列有效个数
int QueueSize(Q* pq) {assert(pq);return pq->size;
}

测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下,处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发,统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体,并分享…

二市在度低开,连续11个交易日低开,后市如何走?

今天的A股,让人愣住了,你知道是为什么吗?盘面上出现2个耐人寻味的重要信号,一起来看看: 1、今天两市再度低开,连续11个交易日低开,让很多人愣住了。别慌!汽车、军工板块大涨&#x…

7月26日-版本更新

拒绝用战术上面的勤奋掩盖自己战略上的懒惰, 根据你提供的列表,这里是每个应用的最后一个版本号: 冥想:1.7.9戒色日记:1.1.0控欲日记:1.0.1单词大赛:1.0.1练字:1.0.6洗冷水澡&#x…

MYSQL存储引擎InnoDB, MyISAM简介

MYSQL存储引擎 在开始谈到mysql存储引擎之前,我们应该知道或者了解存储引擎是什么,存储引擎是为了解决什么样的问题的。 在mysql中,存储引擎是处理不同表类型SQL操作的MySQL组件,同时MySQL服务器采用可插拔的存储引擎架构&#x…

XLua 原理分析 三

前面已经介绍了Lua与C#的基础通信原理,和Wrap中间文件的作用。有了前面2篇的基础,大概已经能搞清这块的原理。 为了加深对这块的印象,这里开始正式分析Xlua中的Lua和C#的通信。 一、Lua如何调用CS的过程 lua的初始化代码: pri…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中,拷贝一段代码后,代码界面一直输入CTRLV命令,导致乌班图桌面死掉,无法操作、 解决方法: 1、强制重启。长按电源按钮强制关机,然后再次开机。 2、使用命令行界面。同时…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料: 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 (开发环境是Linux) 本文目标是在 Windows 下跑通摄像头 hello …

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数,可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法: S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数,…

C语言经典习题25

冒泡排序 对一维数组进行升序排序&#xff0c;然后在数组中输入20个数&#xff0c;将排序后的结果打印输出。 #include<stdio.h> #define N 20 int main() {int a[N];int i;for(i0;i<N;i) //初始化数组的数 {scanf("%d",&a);}for(i0;…

【数据结构】哈希表的模拟实现

文章目录 1. 哈希的概念2. 哈希表与哈希函数2.1 哈希冲突2.2 哈希函数2.3 哈希冲突的解决2.3.1 闭散列&#xff08;线性探测&#xff09;2.3.2 闭散列的实现2.3.3 开散列(哈希桶)2.3.4 开散列的实现 2.4 开散列与闭散列比较 1. 哈希的概念 在我们之前所接触到的所有的数据结构…

FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 推荐课程列表 逻辑很简单 点赞数 > 500 那么符合要求的课程是&#xff1a; def get_like_course(db: Session):"""获取推荐课程…

用Redisson的RMap做一个简单的购物车示例

RMap是Redisson提供的一个高级数据结构&#xff0c;它封装了Redis中的Hash数据类型&#xff0c;提供了一个类似Java HashMap的接口。RMap非常适合在需要分布式共享的键值对集合场景中使用&#xff0c;以下是一些典型的应用场景&#xff1a; 分布式缓存&#xff1a; RMap可以用作…

一番赏小程序搭建,线上一番赏市场

一番赏作为一个经久不衰的潮流市场&#xff0c;一直流行于消费者市场中。一番赏商品拥有不同系列&#xff0c;涵盖了热门动漫、漫画、影视等主题&#xff0c;商品包含了手办等周边商品&#xff0c;具有非常大的收藏价值。相比于其他潮玩模式&#xff0c;一番赏的性价比更高&…

Kylin 入门教程

Apache Kylin 是一个开源的分布式数据仓库和 OLAP(在线分析处理)引擎,旨在提供亚秒级查询响应时间,即使在处理超大规模数据集时也是如此。Kylin 可以有效地将原始数据预计算为多维数据立方体(Cube),并利用这些预计算结果来提供快速查询。本文将带你从基础知识到操作实践…

深入 Symfony 服务容器:依赖注入的艺术

“深入 Symfony 服务容器&#xff1a;依赖注入的艺术” 是一个涵盖了 Symfony 服务容器核心概念和依赖注入机制的复杂话题。为了全面理解 Symfony 服务容器的运作&#xff0c;我们将详细探讨以下几个方面&#xff1a; 服务容器的概念和作用依赖注入的基本原理Symfony 服务容器…

MavLink通信协议 C++应用详细教程

https://blog.csdn.net/qq_44070755/article/details/122222337

Git(分布式版本控制系统)、Gitlab、分支、分支冲突

目录 1.Git概述 2.Git的功能特性 3.Github社区和Gitlab 1.Github社区 2.Gitlab 4.Git的安装及配置 1.Git安装 2.配置Git环境 3.常用指令 4. 建立git仓库 1.创建一个目录 2.初始化当前目录仓库 3.查看隐藏文件 4.新建文件并添加到缓存 5.提交文件到仓库 6.查看历…

GC(垃圾收集)简析:为什么Java需要它?

GC&#xff08;垃圾收集&#xff09;简析&#xff1a;为什么Java需要它&#xff1f; 1、什么是GC&#xff1f;2、为什么Java需要GC&#xff1f;3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、什么是GC&#xff1f; GC&#xff…

黄果树瀑布

早上我们按计划6点吃饭&#xff0c;可是酒店没水了&#xff0c;等我们吃完饭已经近七点 &#xff0c;到景区已经7点多了。景区入口的人特别多&#xff0c;验过包裹&#xff0c;只刷脸就进去了。排队坐大巴&#xff0c;向左是陡坡塘和七星桥。 第一站陡坡塘&#xff0c;服务中心…