栈和队列<数据结构 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://xiahunao.cn/news/3270232.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

贪心算法.

哈夫曼树 哈夫曼树(Huffman Tree),又称为霍夫曼树或最优二叉树,是一种带权路径长度最短的二叉树,常用于数据压缩。 定义:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树…

大话成像公众号文章阅读学习(一)

系列文章目录 文章目录 系列文章目录前言一、扫射拍摄二、索尼Alpha 9 III2.1. 视频果冻效应2.2 闪光灯同步速度2.3 其他功能 三 A9III 局限性总结 前言 大话成像是一个专注成像的公众号,文章都很好。 今天看的这篇是 特朗普遭枪击后“大片”出自它 文章地址 htt…

Python | Leetcode Python题解之第284题窥视迭代器

题目: 题解: class PeekingIterator:def __init__(self, iterator):self.iterator iteratorself._next iterator.next()self._hasNext iterator.hasNext()def peek(self):return self._nextdef next(self):ret self._nextself._hasNext self.itera…

SGLang 大模型推理框架 qwen2部署使用案例;openai接口调用、requests调用

参考: https://github.com/sgl-project/sglang 纯python写,号称比vllm、tensorRT还快 暂时支持模型 安装 可以pip、源码、docker安装,这里用的pip 注意flashinfer安装最新版,不然会可能出错误ImportError: cannot import name ‘top_k_top_p_sampling_from_probs’ fr…

万物互联,触手可及“2024南京智慧城市,物联网,大数据展会”

在金秋送爽的11月,南京这座历史悠久而又充满活力的城市,即将迎来一场科技盛宴——2024南京智慧城市、物联网、大数据展会。这不仅是一场技术的集会,更是未来生活蓝图的预览,它汇聚了全球顶尖的科技企业、创新者及行业精英&#xf…

1.2 单链表定义及操作实现(链式结构)

1.单链表定义 链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性 表简称线性链表。 为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接 后继结点的地址(或位置)…

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A,但是接口A的响应结果不能满足需求;此时,有另一个…

第15周 Zookeeper分布式锁与变种多级缓存

Zookeeper **************************************************************

heic怎么转换成jpg?heic转jpg,分享6款图片格式转换器免费汇总!

众所周知,在与非苹果手机设备用户(如安卓手机或Windows台式机用户)分享照片之前,通常需要将iphone的heic格式转换为jpg。由于这些操作系统的旧版本不原生支持heic图片格式,因此需要额外的第三方工具来查看这些图像。因…

0727,学什么学,周六就应该休息!!!!!

周六就应该休息,一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01:使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器!!! 今天到此为止&#x…

24暑假算法刷题 | Day22 | LeetCode 77. 组合,216. 组合总和 III,17. 电话号码的字母组合

目录 77. 组合题目描述题解 216. 组合总和 III题目描述题解 17. 电话号码的字母组合题目描述题解 77. 组合 点此跳转题目链接 题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输…

面向切面编程(AOP)

通知类型 Grep Console插件可右键选中日志高亮显示 正常情况 异常情况(around after和目标方法在一起,目标方法异常后,around after不执行) 通知顺序 execution 需要匹配两个没有任意交集的方法时,可以使用两个execution annotation 自定义…

【计算机网络】期末实验答辩

注意事项: 1)每位同学要在下面做过的实验列表中选取三个实验进行答辩准备,并将自己的姓名,学号以及三个实验序号填入共享文档"1(2)班答辩名单"中。 2)在答辩当日每位同学由老师在表…

支持向量机 及其分类案例详解(附Python 代码)

支持向量机分类器预测收入等级 我们将构建一个支持向量机(SVM)分类器,以预测一个人基于14个属性的收入等级。我们的目标是判断收入是否高于或低于每年$50,000。因此,这是一个二元分类问题。我们将使用在此处可用的人口普查收入数…

Python高维度大型气象矩阵存储策略分享

零、前情提要 最近需要分析全球范围多变量的数值预报数据,将grb格式的数据下载下来经过一通处理后需要将预处理数据先保存一遍,方便后续操作,处理完发现此时的数据维度很多,数据量巨大,使用不同的保存策略的解析难度和…

nowcoder bc49判断两个数的大小关系

描述 KiKi想知道从键盘输入的两个数的大小关系,请编程实现。 输入描述: 题目有多组输入数据,每一行输入两个整数(范围-231~231-1),用空格分隔。 输出描述: 针对每行输入,输出两…

zotfile基础配置详解

zotfile可以将自动移动pdf到指定文件夹中,那么应该如何配置呢? 遵循极简原则,只需配置两个地方即可。 一、路径配置 第一处是pdf附件存放的位置,可以指定自己想要的地方,我放在了C盘的文档文件夹下。 第二处是分类法…

由恶劣事件: CrowdStrike发布案例更新导致微软全球蓝屏事件的启示

前言 网络安全公司 CrowdStrike 周四发布软件更新后,机场、银行、证券交易所、911 服务、交通系统、酒店、新闻媒体、医院、紧急服务等开始出现臭名昭著的蓝屏死机 (BSOD)。在看似多年来最严重的 IT 中断中,大规模的网络安全软件问题正在全球范围内造成…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码,一起来看看吧! 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…