栈和队列的动态实现(C语言实现)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋栈和队列

  • 🍑栈
    • 🍍栈的含义
    • 🍍栈的结构
    • 🍍栈的实现
      • 🍌栈的补充条件
      • 🍌初始化栈
      • 🍌入栈
      • 🍌出栈
      • 🍌获取栈顶元素
      • 🍌获取栈中有效元素的个数
      • 🍌检查栈是否为空
      • 🍌销毁栈
    • 🍍栈的整体代码的实现
  • 🍑队列
    • 🍍队列的含义
    • 🍍队列的结构
    • 🍍队列的实现
      • 🍌队列的补充条件
      • 🍌初始化队列
      • 🍌队尾入队列
      • 🍌队头出队列
      • 🍌获取队列头部元素
      • 🍌获取队列队尾元素
      • 🍌获取队列中有效元素个数
      • 🍌检测队列是否为空
      • 🍌 销毁队列
    • 🍍队列的整体代码的实现

🍑栈

🍍栈的含义

栈是一种特殊类型的线性表,它的特点是仅允许在其一端进行插入(压入)和删除(弹出)操作。这一端被称为栈顶,而相对的另一端则被称为栈底。栈通常遵循“后进先出”(LIFO)的原则,意味着新加入的元素总是位于栈顶,而要访问或移除的元素必须从前部移除。

🍍栈的结构

在这里插入图片描述

栈的结构就是如图片中的形容的类似,满足先进后出

🍍栈的实现

🍌栈的补充条件

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDatetype;//方便后续数据不只是int,也可以方便的换其他类型typedef struct Stack//利用结构体来定义栈
{STDatetype* a;int top; int capacity;
}ST;
int main()
{ST st;STInia(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}printf("\n");STDestroy(&st);return 0;
}

🍌初始化栈

void STInia(ST* ps)
{assert(ps);ps->top = ps->capacity = 0;ps->a = NULL;
}

🍌入栈

void STPush(ST* ps, STDatetype x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = 0;if (ps->capacity == 0){newcapacity = 2;}else{newcapacity = newcapacity * 2;}STDatetype* tem = (STDatetype*)realloc(ps->a, sizeof(STDatetype) * newcapacity);if (tem == NULL){perror("realloc  fail");exit(-1);}ps->a = tem;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}

(1)之所以在这里不用malloc创建空间,是因为后面还要用realloc进行扩容,所以就直接用realloc进行空间的创建。
(2)在ps->top和ps->capacity相等时进行扩容,在这里进行了判断,有两种情况。第一种是ps->capacity等于0,那就得先创建空间。第二种是ps->capacity不为0,就直接扩容为原来2倍的空间

🍌出栈

void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);//判断数据是否为空(ps->top)--;}

🍌获取栈顶元素

STDatetype STTop(ST* ps)
{assert(ps);assert(ps->top > 0);//判断是否为空return ps->a[ps->top - 1];
}

🍌获取栈中有效元素的个数

int STSize(ST* ps)
{assert(ps);return ps->top;
}

在栈中数据个数其实就是ps->top

🍌检查栈是否为空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

如果为空就返回1,不为空就返回0

🍌销毁栈

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

🍍栈的整体代码的实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDatetype;typedef struct Stack
{STDatetype* a;int top; int capacity;
}ST;void STInia(ST* ps)
{assert(ps);ps->top = ps->capacity = 0;ps->a = NULL;
}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}void STPush(ST* ps, STDatetype x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = 0;if (ps->capacity == 0){newcapacity = 2;}else{newcapacity = ps->capacity * 2;}STDatetype* tem = (STDatetype*)realloc(ps->a, sizeof(STDatetype) * newcapacity);if (tem == NULL){perror("realloc  fail");exit(-1);}ps->a = tem;ps->capacity = newcapacity;}ps->a[ps->top] = x;(ps->top)++;
}void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);(ps->top)--;}int STSize(ST* ps)
{assert(ps);return ps->top;
}bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}STDatetype STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}int main()
{ST st;STInia(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}printf("\n");STDestroy(&st);return 0;
}

🍑队列

🍍队列的含义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

🍍队列的结构

在这里插入图片描述

队列和栈有点类似,只不过栈是先进后出,而队列是先进先出

🍍队列的实现

🍌队列的补充条件


#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDatetype;
typedef struct QueueNode
{struct QueueNode* next;QDatetype date;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;
///
int main()
{Que qq;QueueInia(&qq);QueuePush(&qq, 1);QueuePush(&qq, 2);QueuePush(&qq, 3);QueuePush(&qq, 4);while (!QueueEmpty(&qq)){printf("%d ", QueueFront(&qq));QueuePop(&qq);}printf("\n");return 0;
}

在这个队列中,我是采用了单链表(单向不循环)的结构来实现队列,所以再这里要注意头可能是空指针的问题,在前面我介绍单链表的时候是利用二级指针解决这个问题,而在这里是采用了新的方法,也就是结构体指针,把头和尾重新用一个结构体来定义

🍌初始化队列

void QueueInia(Que* ps)
{assert(ps);ps->head = NULL;ps->tail = NULL;ps->size = 0;
}

🍌队尾入队列

void QueuePush(Que* ps, QDatetype x)
{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc  fail");exit(-1);}newnode->next = NULL;newnode->date = x;if (ps->tail == NULL){ps->head = ps->tail = newnode;}else{ps->tail->next = newnode;ps->tail = newnode;}(ps->size)++;
}

🍌队头出队列

void QueuePop(Que* ps)
{assert(ps);assert(ps->size > 0);if (ps->head->next == NULL){free(ps->head);ps->head = ps->tail = NULL;}else{QNode* cur = ps->head->next;free(ps->head);ps->head = cur;}(ps->size)--;
}

🍌获取队列头部元素

QDatetype QueueFront(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->head->date;
}

🍌获取队列队尾元素

QDatetype QueueBake(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->tail->date;
}

🍌获取队列中有效元素个数

int QueueSize(Que* ps)
{assert(ps);return ps->size;
}

🍌检测队列是否为空

bool QueueEmpty(Que* ps)
{assert(ps);return ps->head == NULL;
}

🍌 销毁队列

void QueueDestroy(Que* ps)
{assert(ps);QNode* cur = ps->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}ps->head = ps->tail = NULL;ps->size = 0;
}

🍍队列的整体代码的实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDatetype;
typedef struct QueueNode
{struct QueueNode* next;QDatetype date;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;void QueueInia(Que* ps)
{assert(ps);ps->head = NULL;ps->tail = NULL;ps->size = 0;
}bool QueueEmpty(Que* ps)
{assert(ps);return ps->head == NULL;
}void QueuePush(Que* ps, QDatetype x)
{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc  fail");exit(-1);}newnode->next = NULL;newnode->date = x;if (ps->tail == NULL){ps->head = ps->tail = newnode;}else{ps->tail->next = newnode;ps->tail = newnode;}(ps->size)++;
}void QueuePop(Que* ps)
{assert(ps);assert(ps->size > 0);if (ps->head->next == NULL){free(ps->head);ps->head = ps->tail = NULL;}else{QNode* cur = ps->head->next;free(ps->head);ps->head = cur;}(ps->size)--;
}QDatetype QueueFront(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->head->date;
}QDatetype QueueBake(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->tail->date;
}int QueueSize(Que* ps)
{assert(ps);return ps->size;
}void QueueDestroy(Que* ps)
{assert(ps);QNode* cur = ps->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}ps->head = ps->tail = NULL;ps->size = 0;
}int main()
{Que qq;QueueInia(&qq);QueuePush(&qq, 1);QueuePush(&qq, 2);QueuePush(&qq, 3);QueuePush(&qq, 4);while (!QueueEmpty(&qq)){printf("%d ", QueueFront(&qq));QueuePop(&qq);}printf("\n");return 0;
}

队列和栈我就不详细介绍了,如果有需要可以看我写的这篇博客:单链表

本期的内容就结束了,文章有错误的地方欢迎大家指正!!!

请添加图片描述

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

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

相关文章

图像与二进制数据间的转换

概述 此文档主要是记录图像与二进制互相转换的方法&#xff0c;此文档记录于20220811 进行图片和二进制的互相转换 若想转为base64&#xff0c;可以看 图像与base64互转 的内容。 Python 资料&#xff1a;python 图片和二进制转换的三种方式_脸不大的CVer的博客-CSDN博客_p…

统计学-R语言-7.3

文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…

1 月 26日算法练习

文章目录 九宫幻方穿越雷区走迷宫 九宫幻方 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三阶幻方指的是将1~9不重复的填入一个33的矩阵当中&#xff0c;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

第十七讲_HarmonyOS应用开发Stage模型应用组件

HarmonyOS应用开发Stage模型应用组件 1. 应用级配置2. Module级配置3. Stage模型的组件3.1 AbilityStage3.1.1 AbilityStage的创建和配置3.1.2 AbilityStage的生命周期回调3.1.3 AbilityStage的事件回调&#xff1a; 3.2 UIAbility3.2.1 UIAbility生命周期3.2.3 UIAbility启动模…

CSAPP fall2015 深入理解计算机系统 Cache lab详解

Cache Lab cache lab 缓存实验 代码下载 从CSAPP上面下载对应的lab代码 http://csapp.cs.cmu.edu/3e/labs.html 环境准备 需要安装 valgrind。可以参考文章Valgrind centos。 安装好以后执行valgrind --version可以看到版本号。 Cache simulator cache simulator not a …

ART: Automatic multi-step reasoning and tool-use for large language models 导读

ART: Automatic multi-step reasoning and tool-use for large language models 本文介绍了一种名为“自动推理和工具使用&#xff08;ART&#xff09;”的新框架&#xff0c;用于解决大型语言模型&#xff08;LLM&#xff09;在处理复杂任务时需要手动编写程序的问题。该框架可…

【音视频原理】音频编解码原理 ③ ( 音频 比特率 / 码率 | 音频 帧 / 帧长 | 音频 帧 采样排列方式 - 交错模式 和 非交错模式 )

文章目录 一、音频 比特率 / 码率1、音频 比特率2、音频 比特率 案例3、音频 码率4、音频 码率相关因素5、常见的 音频 码率6、视频码率 - 仅做参考 二、音频 帧 / 帧长1、音频帧2、音频 帧长度 三、音频 帧 采样排列方式 - 交错模式 和 非交错模式1、交错模式2、非交错模式 一…

排序问题上机考试刷题

排序与查找可以说是计算机领域最经典的问题&#xff0c;排序和查找问题在考研机试真题中经常出现。排序考点在历年机试考点中分布广泛。排序既是考生必须掌握的基本算法&#xff0c;又是考生 学习其他大部分算法的前提和基础。首先学习对基本类型的排序。对基本类型排序&#x…

【C++中的STL】函数对象

函数对象 函数对象概念谓词概念 内建函数对象算术仿函数关系仿函数逻辑仿函数&#xff08;基本用不到&#xff09; 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff0c;函数对象使用重载的()时。行为类似函数调用&#xff0c;也叫仿函数。 函数…

分析crash日志

每一天都要快乐的进步~~ 文章目录 在分析 crash 日志时&#xff0c;通常需要关注以下信息&#xff1a; 1️⃣ 错误信息&#xff1a;了解 crash 的具体错误信息&#xff0c;这有助于定位问题的根源所在。 2️⃣ 堆栈跟踪&#xff1a;查看堆栈跟踪&#xff0c;确定 crash 发生的…

4.F1 评分机器学习模型性能的常用的评估指标

F1评分作为机器学习领域中的一个综合性评价指标&#xff0c;旨在在准确率和召回率之间寻求平衡&#xff0c;进而提供对模型性能全面评估的手段。本文将深入探讨F1评分的定义、计算方法、应用领域、案例研究以及未来发展方向&#xff0c;力求为读者提供详实而全面的了解。 一.F…

C#学习笔记_StringBuilder+程序效率测试

String问题&#xff1a;当程序中进行过多字符串处理操作时&#xff0c;会在内存中产生过多垃圾信息&#xff0c;影响程序效率。 StringBuilder简介 StringBuilder为一个类&#xff0c;属于引用类型。StringBuilder与string的区别在于&#xff0c;StringBuilder对于字符串的操…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

语音方向精典论文品读_HuBERT

英文名称: HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden Units 中文名称: HuBERT&#xff1a;通过隐藏单元的屏蔽预测进行自监督语音表示学习 链接: http://arxiv.org/abs/2106.07447v1 代码: https:// github.com/pytorch/fairseq…

vertica10.0.0单点安装_ubuntu18.04

ubuntu的软件包格式为deb&#xff0c;而rpm格式的包归属于红帽子Red Hat。 由于项目一直用的vertica-9.3.1-4.x86_64.RHEL6.rpm&#xff0c;未进行其他版本适配&#xff0c;而官网又下载不到vertica-9.3.1-4.x86_64.deb&#xff0c;尝试通过alian命令将rpm转成deb&#xff0c;但…

盘古信息IMS OS 数垒制造操作系统+ 产品及生态部正式营运

启新址吉祥如意&#xff0c;登高楼再谱新篇。2024年1月22日&#xff0c;广东盘古信息科技股份有限公司新办公楼层正式投入使用并举行了揭牌仪式&#xff0c;以崭新的面貌、奋进的姿态开启全新篇章。 盘古信息总部位于东莞市南信产业园&#xff0c;现根据公司战略发展需求、赋能…

交叉熵损失函数求导与Softmax函数求导

交叉熵损失函数求导与Softmax函数求导 前情提要 交叉熵损失函数 对Softmax函数求导 对交叉熵损失函数求导 前情提要 在做单分类的时候&#xff0c;一般模型的最后一层是线性层Linear做分类器&#xff0c;输出在每个标签上的logits。损失函数为交叉熵损失函数&#xff0c;会…

redis过期事件监听、可以做延时任务 第二篇(简单)

在使用redis时&#xff0c;所有的key都要设置过期时间&#xff0c;过期之后&#xff0c;redis就会把对应的key清除掉。 此方法可以监听redis的key失效&#xff0c;在失效时做一些逻辑处理 redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务 现象&#xff1a; redis …

AWS 专题学习 P12 (CloudWatch、CloudTrail、AWS Config)

文章目录 专题总览1. CloudWatch1.1 Amazon CloudWatch Metrics1.2 CloudWatch Metric Streams1.3 CloudWatch LogsCloudWatch Logs - SourcesCloudWatch Logs Metric Filter & InsightsCloudWatch Logs – S3 ExportCloudWatch Logs SubscriptionsCloudWatch Logs Aggrega…