【数据结构】--- 栈和队列

前言

        前面学习了数据结构的顺序表、单链表、双向循环链表这些结构;现在就来学习栈和队列,这里可以简单的说栈和队列是具有特殊化的线性表

一、栈

        1.1、栈的概念和结构

        栈是一种遵循先入后出逻辑的线性数据结构。

        栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作;进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

        栈中的数据元素遵循先进后出(LIFO)的原则;也就是所谓的后来者居上

        如图所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将元素添加到栈顶的操作叫做“入栈”,删除栈顶的元素叫做“出栈”。

从图中我们可以看出,栈数据的出栈和入栈都在栈顶;这就是栈数据先进后出的原则。

        1.2、栈的实现

        栈的实现可以使用数组来实现,当然也可以使用链表来实现,这里就用数组来实现栈。

用数组来实现栈就和之前顺序表的实现有些相似,对顺序表不了解的话可以看一下前面的

【数据结构】--- 顺序表

首先先来看一下,栈这个数据结构都要实现哪些功能:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int SType;
typedef struct Stack
{SType* arr;int size;  //栈顶int num;   //空间大小
}Stack;//初始化
void STInit(Stack* ps);
//判断栈是否为空
bool STEmpty(Stack* ps);
//入栈
void STPush(Stack* ps, SType x);
//出栈
void STPop(Stack* ps);
//取栈顶数据
SType STtop(Stack* ps);
//获取栈中数据个数
int STSize(Stack* ps);
//栈的销毁
void STDesTroy(Stack* ps);

1.2.1、初始化

//初始化
void STInit(Stack* ps)
{assert(ps);ps->arr = NULL;ps->size = ps->num = 0;
}

1.2.2、判断栈是否为空

        判断栈是否为空?如果为空,就返回true;如果不为空,就返回false。

//判断栈是否为空
bool STEmpty(Stack* ps)
{assert(ps);return ps->size == 0;
}

1.2.3、入栈

        入栈,在栈顶插入数据(和顺序表尾插相似)

//入栈
void STPush(Stack* ps, SType x)
{assert(ps);//判断空间大小是否足够if (ps->num <= ps->size){int newnum = (ps->num == 0) ? 4 : 2 * ps->num;SType* tmp = (SType*)realloc(ps->arr, newnum * sizeof(Stack));if (tmp == NULL){perror("realloc filed");exit(1);}ps->arr = tmp;ps->num = newnum;}ps->arr[ps->size++] = x;
}

1.2.4、出栈        

        出栈,删除栈顶的数据(和顺序表尾删相似)

//出栈
void STPop(Stack* ps)
{assert(ps); //不能传NULLassert(!STEmpty(ps));  //栈不能为空ps->size--;
}

1.2.5、取栈顶数据

        取栈顶数据,将栈顶的数据返回即可

//取栈顶数据
SType STtop(Stack* ps)
{assert(ps); //不能传NULLassert(!STEmpty(ps));  //栈不能为空return ps->arr[ps->size - 1];
}

1.2.6、获取栈中数据个数

        获取栈中数据个数,这里size就是栈的数据个数

//获取栈中数据个数
int STSize(Stack* ps)
{assert(ps);return ps->size;
}

1.2.7、销毁栈

        这里,动态开辟的空间要进行释放,养成好习惯

//栈的销毁
void STDesTroy(Stack* ps)
{assert(ps);if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->num = 0;
}

二、队列

        2.1、队列的概念和结构

        队列,是一种遵循先入先出规则的线性数据结构。

        顾名思义,队列模拟了现实生活中排队现象,即新来的人不断加入队列队尾,而位于对头的人逐个离开

        队列只允许在一端进行插入数据操作,在另一端进行删除数据操作

如图,我们将队列头部称为“对头(队首)”,尾部称为“队尾”;

将把元素插入到队尾操作称为“入队”,删除队首的数据的操作称为“出队”

        2.2、队列的实现

队列的实现,这里也是即可以使用数组来实现,也可以使用链表来实现;这里使用链表来实现队列

 用链表来实现队列就和之前链表的实现有些相似,对单链表不了解的话可以看一下前面的

【数据结构】--- 单链表的实现

        先来卡看队列的基本功能

typedef int QType;
typedef struct QueueNode //队列节结构
{QType data;struct QueueNode* next;
}QueueNode;
typedef struct Queue //队列结构
{int size;   //队列中的数据个数QueueNode* phead; //队头QueueNode* ptial; //队尾
}Queue;//初始化
void QueueInit(Queue* pq);
//判断队列是否为空
bool QueueEmpty(Queue* pq);
//入队列--从队尾删除数据
void QueuePush(Queue* pq);
//出队列--从对头删除数据
void QueuePop(Queue* pq);
//取队头数据
QType QueueFront(Queue* pq);
//取队尾数据
QType QueueBack(Queue* pq);
//获取队列数据个数
int QueueSize(Queue* pq);
//销毁队列
void QueueDesTroy(Queue* pq);

2.2.1、初始化

//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptial = NULL;pq->size = 0;
}

2.2.2、判断队列是否为空

        如果队列为空,返回true;如果不为空,返回false

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

2.2.3、入队列

        从队列尾部插入数据,与单链表尾插类似

//入队列--从队尾插入数据
void QueuePush(Queue* pq, QType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));newnode->data = x;newnode->next = NULL;if (QueueEmpty(pq)) // 队列为空{pq->phead = pq->ptial = newnode;}else {  //队列不为空pq->ptial->next = newnode;pq->ptial = newnode;}pq->size++;
}

2.2.4、出队列

        从队头删除数据,与链表头删类似

//出队列--从对头删除数据
void QueuePop(Queue* pq)
{assert(pq);  //不能传NULLassert(!QueueEmpty(pq));  //队列不能为空QueueNode* del = pq->phead;pq->phead = pq->phead->next;if (pq->size == 1)  //队列只有一个节点{pq->ptial = NULL;}pq->size--;free(del);del = NULL;
}

2.2.5、取队头数据

        取队头的数据返回

//取队头数据
QType QueueFront(Queue* pq)
{assert(pq);  //不能传NULLassert(!QueueEmpty(pq));  //队列不能为空return pq->phead->data;
}

2.2.6、取队尾数据

        取队尾数据返回

//取队尾数据
QType QueueBack(Queue* pq)
{assert(pq);  //不能传NULLassert(!QueueEmpty(pq));  //队列不能为空return pq->ptial->data;
}

2.2.7、获取队列数据个数

        获取队列数据个数,这里实现队列时,定义了一个结构体成员size记录队列数据个数。

//获取队列数据个数
int QueueSize(Queue* pq)
{assert(pq);  //不能传NULLreturn pq->size;
}

2.2.8、销毁队列

        队列是由链表实现的,而链表是动态开辟的内存,记得释放。

//销毁队列
void QueueDesTroy(Queue* pq)
{assert(pq);  //不能传NULLassert(!QueueEmpty(pq));  //队列不能为空QueueNode* pcur = pq->phead;while (pcur){QueueNode* del = pcur;pcur = pcur->next;free(del);del = NULL;}pq->phead = pq->ptial = NULL;pq->size = 0;
}

感谢各位大佬支持并指出问题,

                        如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!

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

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

相关文章

vivado FFT IP Core

文章目录 前言FFT IP 接口介绍接口简介tdata 格式说明 其他细节关于计算精度及缩放系数计算溢出架构选择数据顺序实时/非实时模式数据输入输出时序关于配置信息的应用时间节点 FFT IP 例化介绍控制代码实现 & 测试参考文献 前言 由于计算资源受限&#xff0c;准备将上位机 …

【漏洞复现】泛微E-Cology WorkflowServiceXml SQL注入漏洞

0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台&#xff0c;支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 泛微OAE-Cology 接口/services/WorkflowServiceXml 存在SQL注入漏洞&#xff0c;可获取数据库权限&#xff0c;导致数据泄露…

Qt日志库QsLog使用教程

前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库&#xff0c;这个库有个麻烦的点是要配置config文件&#xff0c;所以这次切换到了QsLog。用了后这个库的感受是&#xff0c;比较轻量级&#xff0c;嘎嘎好用&#xff0c;推荐一波。 下载QsLog库 https://github.c…

【踩坑日记】【教程】嵌入式 Linux 通过 nfs 下载出现 T T T T [Retry count exceeded: starting again]

文章目录 1 本篇文章解决的问题2 问题解决原理3 问题环境4 开启 ubuntu-20.04 的 nfs24.1 确认 nfs2 是否已经开启4.2 开启 nfs2 5 卸载 iptables5.1 卸载 iptables5.2 禁用 ufw5.3 尝试重新下载 6 原理分析6.1 nfs2 开启部分6.2 卸载 iptables 部分 7 后记7.1 拓扑结构一7.2 拓…

【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks

阅读时间&#xff1a;2023-12-26 1 介绍 年份&#xff1a;2019 作者&#xff1a;Johannes von Oswald&#xff0c;Google Research&#xff1b;Christian Henning&#xff0c;EthonAI AG&#xff1b;Benjamin F. Grewe&#xff0c;苏黎世联邦理工学院神经信息学研究所 期刊&a…

【Vue3 ts】echars图表展示统计的月份数据

图片展示 此处内容为展示24年各个月份产品的创建数量。在后端统计24年各个月份产品数量后&#xff0c;以数组的格式发送给前端&#xff0c;前端负责展示。 后端 entity层&#xff1a; Data Schema(description "月份统计")public class MonthCount {private Stri…

处理uniapp刷新后,点击返回按钮跳转到登录页的问题

在使用uniapp的原生返回的按钮时&#xff0c;如果没有刷新会正常返回到对应的页面&#xff0c;如果刷新后会在当前页反复横跳&#xff0c;或者跳转到登录页。那个时候我第一个想法时&#xff1a;使用浏览器的history.back()方法。因为浏览器刷新后还是可以通过右上角的返回按钮…

01认识Java(介绍安装调试)

单元概述 本章主要介绍Java语言的发展历史&#xff0c;了解Java的运行原理及Java编程语言的特点&#xff0c;通过搭建Eclipse集成开发环境来运行Java应用程序。 1.1 Java简介 1.1.1 什么是Java 计算机语言是人与计算机之间的通讯语言&#xff0c;分为机器语言、汇编语言、高…

短视频是如何一步步“蚕食”我们大脑的?

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 今天我们将深入探讨短视频是如何「蚕食」我们的大脑。 首先问下自己&#xff0c;你有多久没有看完一篇长文了&#xff1f; 你是否曾在清晨阳光中&#xff0c;被手机屏幕上短视频图标吸引&#xff0c;而忘记…

ArrayList.subList的踩坑

需求描述&#xff1a;跳过list中的第一个元素&#xff0c;获取list中的其他元素 原始代码如下&#xff1a; List<FddxxEnterpriseVerify> companyList fddxxEnterpriseVerifyMapper.selectList(companyQueryWrapper);log.info("获取多个法大大公司数据量为&#…

【Vue】快速入门:构建你的第一个Vue 3应用

文章目录 一、Vue简介二、环境搭建1. 安装Node.js和npm2. 安装Vue CLI 三、创建Vue项目四、项目结构介绍五、组件基础创建一个组件使用组件 六、模板语法插值指令v-bindv-ifv-for 七、事件处理八、状态管理安装Vuex创建Store使用Store 九、路由基础安装Vue Router配置路由使用路…

科普文:详解23种设计模式

概叙 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four&#xff08;GoF&#xff09;的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途我们又可以分为三大类&#xff0c;分别为创建型模式…

《Python数据科学之四:建模与机器学习基础》

《Python数据科学之四&#xff1a;建模与机器学习基础》 在数据科学项目中&#xff0c;经过数据清洗、探索性数据分析&#xff08;EDA&#xff09;和数据可视化之后&#xff0c;下一个重要步骤是建立数据模型并应用机器学习技术。本文将深入探讨如何使用 Python 进行建模和机器…

Java异常抛出与处理方法

在Java编程中&#xff0c;异常处理是一个非常重要的部分。通过正确的异常处理&#xff0c;我们可以提高程序的健壮性和可靠性&#xff0c;避免程序在运行过程中出现意外的崩溃。本文将详细讲述Java异常的抛出与处理方法&#xff0c;并通过示例代码进行说明。 一、Java异常的分…

11 网络编程、反射

文章目录 网络编程1、网络的相关概念2、InetAddress 类3、Socket4、TCP 网络通信编程5、UDP 网络通信编程 反射1、反射机制2、Class 类3、类加载4、通过反射获取类的结构信息5、通过反射创建对象6、通过反射访问类中的成员 网络编程 1、网络的相关概念 网络通信 网络 ip 地…

安全防御:智能选路

目录 一、智能选路 1.1 就近选路 1.2 策略路由 1.3 虚拟系统---VRF 二、全局选路策略 1&#xff0c;基于链路带宽进行负载分担 2&#xff0c;基于链路质量进行负载分担 3&#xff0c;基于链路权重的负载分担 4&#xff0c;根据链路优先级的主备备份 DNS透明代理 一、…

Codeforces Round 895 (Div. 3)(A~G)

A. Two Vessels Problem - A - Codeforces 要我们找到最少操作多少次&#xff0c;a和b内的水一样多&#xff0c;从a拿出i克放到b中&#xff0c;之间的差距减少2i&#xff0c;数据范围不大&#xff0c;循环解决即可。 #include<iostream> #include<algorithm> #in…

推荐算法——MRR

定义&#xff1a; MRR计算的是第一个正确答案的排名的倒数&#xff0c;并对所有查询取平均值。它衡量了模型在排序结果中快速找到正确答案的能力。 其中&#xff1a; Q 是查询的总数。ranki​ 是第 i 个查询中第一个正确答案的排名&#xff08;位置&#xff09;。如果第一个正…

Django定时任务框架django-apscheduler的使用

1.安装库 pip install django-apscheduler 2.添加 install_app django_apscheduler 3.在app下添加一个task.py文件&#xff0c;用来实现具体的定时任务 task.pydef my_scheduled_job():print("这个任务每3秒执行一次", time.time()) 4.在app下创建一个manag…

我在哪里可以找到Vim速查表备忘单?

以下是一些适合初学者和高级用户的Vim速查表推荐&#xff1a; aral的Vim速查表 这是一个空间感强且易于理解的速查表&#xff0c;帮助你理解每个命令将跳转到的位置。aral的Vim速查表 Vim速查表 如果你需要一个全面且用户友好的速查表&#xff0c;可以访问Vim速查表。这个资源…