数据结构:栈和队列(超详细)

目录

​编辑

栈:

栈的概念及结构:

 栈的实现:

队列:

队列的概念及结构:

 队列的实现:

扩展知识:

 以上就是个人学习线性表的个人见解和学习的解析,欢迎各位大佬在评论区探讨!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!


栈:

栈的概念及结构:

        栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。一般用在1.公平性排队(抽号机);2.BFS(广度优先遍历)。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

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

 栈的实现:

        栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。链的尾插需要调动更多的数据过程中有更多的消耗

// 支持动态增长的栈
typedef int STDataType ;
typedef struct Stack
{
STDataType * _a ;
int _top ; // 栈顶
int _capacity ; // 容量
} Stack ;
// 初始化栈
void StackInit ( Stack * ps );
// 入栈
void StackPush ( Stack * ps , STDataType data );
// 出栈
void StackPop ( Stack * ps );
// 获取栈顶元素
STDataType StackTop ( Stack * ps );
// 获取栈中有效元素个数
int StackSize ( Stack * ps );
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回 0
int StackEmpty ( Stack * ps );
// 销毁栈
void StackDestroy ( Stack * ps );

 //初始化栈


//初始化
void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}

//入栈

//入栈
void SLPush(SL* ps, STDataType x)
{assert(ps);//栈顶=容量说明需要扩容if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->capacity = newcapacity;ps->a = tmp;}ps->a[ps->top] = x;//后缀++方便下一次入栈和打印栈顶ps->top++;
}

//出栈

//出栈
void SLPop(SL* ps)
{assert(ps);//为空情况“0”assert(ps->top > 0);//--ps->top;
}

//获得栈顶元素

//获得栈顶元素
STDataType SLTTop(SL* ps)
{assert(ps);//为空情况“0”assert(ps->top > 0);int n = (ps->top) - 1;return ps->a[n];
}

 //获取栈中有效元素个数

//获取栈中有效元素个数
int SLSize(SL* ps)
{assert(ps);return ps->top;
}

//销毁栈

//销毁栈
void SLDestroy(SL* ps)
{assert(ps);//开辟数组优势:一次全部释放free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool SLEmpty(SL* ps)
{assert(ps);//为“0”说明为NULLif (ps->top == 0){return true;}return false;
}

队列:

队列的概念及结构:

         队列: 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO(First In First Out) 。
入队列:进行插入操作的一端称为队尾; 
出队列:进行删除操作的一端称为队头。

 队列的实现:

        队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低

// 链式结构:表示队列
typedef struct QListNode
{
struct QListNode * _pNext ;
QDataType _data ;
} QNode ;
// 队列的结构
typedef struct Queue
{
QNode * _front ;
QNode * _rear ;
} Queue ;
// 初始化队列
void QueueInit ( Queue * q );
// 队尾入队列
void QueuePush ( Queue * q , QDataType data );
// 队头出队列
void QueuePop ( Queue * q );
// 获取队列头部元素
QDataType QueueFront ( Queue * q );
// 获取队列队尾元素
QDataType QueueBack ( Queue * q );
// 获取队列中有效元素个数
int QueueSize ( Queue * q );
// 检测队列是否为空,如果为空返回非零结果,如果非空返回 0
int QueueEmpty ( Queue * q );
// 销毁队列
void QueueDestroy ( Queue * q );

//初始化

//初始化
void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}

//入列

//入列
void QueuePush(Que* pq, Qdatatype x)
{assert(pq);//开辟队列结构动态内存Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//第一次或N+1次if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}

//出列

//出列
void QueuePop(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->head->next == NULL){//就剩下一个free(pq->head);pq->head = pq->tail = NULL;}else{//剩下两个及以上Que * del = pq->head;pq->head = pq->head->next;free(del);}pq->size--;
}

// 获取队列头部元素 

// 获取队列头部元素 
Qdatatype QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

// 获取队列队尾元素 

// 获取队列队尾元素 
Qdatatype QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

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

// 获取队列中有效元素个数 
int QueueSize(Que* pq)
{assert(pq);return pq->size;
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}

//销毁

//销毁
void QueueDestroy(Que* pq)
{assert(pq);while (pq->head){Que* del = pq->head->next;free(pq->head);pq->head = del;pq->size--;}pq->head = pq->tail = NULL;
}

扩展知识:

        队列适合使用链表实现,使用顺序结构(即固定的连续空间)实现时会出现假溢出的问题,因此大佬们设计出了循环队列,循环队列就是为了解决顺序结构实现队列假溢出问题的

        循环队列:实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。

 

        同时指向一个位置为空rear(尾)的下一个位置为front(头)时说明已经填满此处是多开辟了一个空间来做判断是否为满 !!!

 以上就是个人学习线性表的个人见解和学习的解析,欢迎各位大佬在评论区探讨!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              

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

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

相关文章

PHP substr()函数详解,PHP截取字符串。

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 substr 一、截取字符串二、截取中文字符串三、leng…

clickhouse集群部署

一、集群部署简介 部署的详情可以看官网 先部署两个server,三个keeper[zookeeper] clickhouse之前依赖的存储是zookeeper,后来改为了keeper,官网给出了原因 所以这就决定了clickhouse有两种安装方式,依赖于keeper做存储或者依赖于zookeeper做存储 二、zookeeper作…

注册中心 —— SpringCloud Netflix Eureka

Eureka 简介 Eureka 是一个基于 REST 的服务发现组件,SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务注册与发现,同时提供了负载均衡、故障转移等能力,目前 Eureka2.0 已经不再维护&#xf…

基于YOLOv8模型和Caltech数据集的行人检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要 基于YOLOv8模型和Caltech数据集的行人检测系统可用于日常生活中检测与定位行人,利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

C#使用FileInfo和DirectoryInfo类来执行文件和文件夹操作

System.IO.FileInfo 和 System.IO.DirectoryInfo 是C#中用于操作文件和文件夹的类,它们提供了许多有用的方法和属性来管理文件和文件夹。 System.IO.FileInfo: FileInfo 类用于操作单个文件的信息和内容。以下是一些常用的方法和属性: Exi…

频繁full gc 调参

Error message from spark is:java.lang.Exception: application_1678793738534_17900289 Driver Disassociated [akka.tcp://sparkDriverClient11.71.243.117:37931] <- [akka.tcp://sparkYarnSQLAM9.10.130.149:38513] disassociated! 日志里频繁full gc &#xff0c;可以…

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料&#xff1a;https://blo…

js实现将文本转PDF格式并下载到本地

html里面需要引入jspdf.umd.min.js和FileSaver.js jspdf.umd.min.js&#xff1a;https://www.npmjs.com/package/jspdf FileSaver.js&#xff1a;https://download.csdn.net/download/weixin_45791806/87272893?spm1001.2014.3001.5503 同时项目的根部目录也需要引入SimHei.tt…

单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.7 进制及其转换

进制是数字的进位计数制&#xff0c;R进制也就是逢R进一。计算机只能识别二进制&#xff0c;也就是逢二进一&#xff0c;例如&#xff0c;11在十进制中为2&#xff0c;在二进制中逢2进1&#xff0c;则为10。以下为进制表示表。 二进制三进制八进制九进制十进制十六进制0000001…

【LeetCode 算法】Find the Losers of the Circular Game 找出转圈游戏输家

文章目录 Find the Losers of the Circular Game 找出转圈游戏输家问题描述&#xff1a;分析代码模拟 Tag Find the Losers of the Circular Game 找出转圈游戏输家 问题描述&#xff1a; n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从…

AD域控制器将辅域控制器角色提升为主域控制器

背景 域控服务器迁移&#xff0c;已将新机器添加为该域的辅域控制器。 主域控制器&#xff1a;test-dc-01 辅域控制器&#xff1a;test-dc-02 需求将主辅域的角色进行互换&#xff0c;test-dc-01更换为辅域&#xff0c;test-dc-02更换为主域。 操作步骤 方法1 命令行修改AD域…

Datawhale Django入门组队学习Task02

Task02 首先启动虚拟环境&#xff08;复习一下之前的&#xff09; 先退出conda的&#xff0c; conda deactivate然后cd到我的venv下面 &#xff0c;然后cd 到 scripts&#xff0c;再 activate &#xff08;powershell里面&#xff09; 创建admin管理员 首先cd到项目路径下&a…

mySQL 视图 VIEW

简化版的创建视图 create view 视图名 as select col ...coln from 表create view 视图名&#xff08;依次别名&#xff09; as select col ...coln from 表create view 视图名 as select col “别名1”&#xff0c;。。。col "别名n" from 表show tab…

Flink的常用算子以及实例

1.map 特性&#xff1a;接收一个数据&#xff0c;经过处理之后&#xff0c;就返回一个数据 1.1. 源码分析 我们来看看map的源码 map需要接收一个MapFunction<T,R>的对象&#xff0c;其中泛型T表示传入的数据类型&#xff0c;R表示经过处理之后输出的数据类型我们继续往…

计算机提示vcruntime140_1.dll丢失的解决方法

在使用Windows操作系统时&#xff0c;有时候我们可能会遇到一些应用程序无法正常运行的问题&#xff0c;出现错误提示&#xff0c;其中之一可能就是缺少或损坏了vcruntime140_1.dll文件。在遇到这种情况时&#xff0c;我们可以尝试修复vcruntime140_1.dll文件来解决问题。 先科…

后端 springboot 给 vue 提供参数

前端 /** 发起新增或修改的请求 */requestAddOrEdit(formData) {debuggerif(formData.id undefined) {formData.id }getAction(/material/getNameModelStandard, {standard: this.model.standard,name: this.model.name,model: this.model.model}).then((res) > {if (res …

《零基础7天入门Arduino物联网-06》程序基础-编程语言是什么

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 程序基础-编程语言是什么 程序是什么 程序设计可以理解为是用计算机语言创造出一系列指令的过程…

Shell 基本运算符

Shell 基本运算符 Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算数运算符关系运算符布尔运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 expr&#…

HuggingFace开源的自然语言处理AI工具平台

HuggingFace是一个开源的自然语言处理AI工具平台&#xff0c;它为NLP的开发者和研究者提供了一个简单、快速、高效、可靠的解决方案&#xff0c;让NLP变得更加简单、快速、高效、可靠。 Hugging Face平台主要包括以下几个部分&#xff1a; Transformers&#xff1a;一个提供了…