数据结构——队列和栈

目录

一、栈

        1、概念与结构

        2、栈的结构与初始化

        3、入栈

        4、出栈 

        5、取栈顶元素 

        6、取栈中有效元素个数 

         7、栈是否为空

 二、队列

         1、概念与结构

        2、队列的结构与初始化

         3、入队列

         4、出队列

         5、取队头数据

         6、取队尾数据

         7、队列判空

         8、队列中有效元素个数

 练习题目链


一、栈

        1、概念与结构

        栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作,进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

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

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

        栈的底层逻辑实现,可以是使用顺序表实现也可以使用链表表实现,我这里采用的是动态顺序表实现

        栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊数据的代价⽐较⼩

        2、栈的结构与初始化

// 栈——后进先出
struct stack
{int* data;//栈int top;//栈顶元素位置int capacity;//栈的容量
};//栈初始化
void stackinit(struct stack* stack)
{//设置栈顶位置stack->top = 0;//初始栈的容量为4stack->capacity = 4;//创建数组stack->data = (int*)malloc(sizeof(int) * stack->capacity);
}

        3、入栈

         时间复杂度:O( 1 )

        在栈的结构中 top 时刻记录着栈顶的位置,直接插入即可,因此时间复杂度为O( 1 )

        注意在插入前要检查栈是否已经满了,如果满了要扩容 

//栈顶插入元素
void stackpush(struct stack* stack, int x)
{//判断是否需要扩容if (stack->top == stack->capacity){//扩容至当前栈容量的两倍stack->capacity = stack->capacity * 2;//更新栈int* newstack = (int*)realloc(stack->data, sizeof(int) * stack->capacity);//创建失败if (newstack){assert("error");}stack->data = newstack;}//栈顶插入元素stack->data[stack->top] = x;//栈顶加一stack->top++;
}

        4、出栈 

         时间复杂度:O( 1 )

         在栈的结构中 top 时刻记录着栈顶的位置,直接减少栈中有效元素即可,因此时间复杂度为O( 1 )

//栈顶删除元素
void stackpop(struct stack* arr)
{//栈不能为空if (arr->top == 0){return;}//出栈arr->top--;
}

        5、取栈顶元素 

        时间复杂度:O( 1 )

         在栈的结构中 top 时刻记录着栈顶的位置,直接返回即可,因此时间复杂度为O( 1 )

//查找栈顶元素
int stacktop(struct stack* arr)
{//栈不能为空if (arr->top != 0){assert("stack is NULL");}//返回栈顶元素return arr->data[(arr->top) - 1];
}

        6、取栈中有效元素个数 

        时间复杂度:O( 1 )

         在栈的结构中 top 时刻记录着栈顶的位置,也是栈中有效元素个数直接返回即可,因此时间复杂度为O( 1 )

//查找栈中元素个数
int stacksize(struct stack* arr)
{//查找栈中元素个数return arr->top;
}

         7、栈是否为空

         时间复杂度:O( 1 )

        判断栈中元素个数是否为零 

//判断栈是否为空
int stackempty(struct stack* arr)
{//判断栈是否为空if (arr->top != 0){return 1;}else{return 0;}
}

 二、队列

         1、概念与结构

        队列:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)

        ⼊队列:进⾏插⼊操作的⼀端称为队尾

        出队列:进⾏删除操作的⼀端称为队头

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

        2、队列的结构与初始化

//队列节点
struct queuenode
{int data;//存储数据struct queuenode* next;//下一个元素的地址
};
//队列,维护队列的队尾和对头
struct queue
{struct queuenode* head;//队头struct queuenode* tail;//队尾int size;//队列有效元素个数
};
//队列初始化
void queueinit(struct queue* queue)
{//初始为空queue->head = NULL;queue->tail = NULL;//初始队列中元素个数为0queue->size = 0;
}

         3、入队列

        时间复杂度:O( 1 ) 

        我们有维护队列的尾节点,创建一个新节点在尾节点后插入同时更新尾节点的指向 ,因此时间复杂度为O( 1 )

//队列——插入
void queuepush(struct queue* list, int x)
{//创建队列节点,并初始化struct queuenode* node = calloc(1, sizeof(struct queuenode));node->data = x;node->next = NULL;//队列中没有元素时,对头和队尾都为新创建的节点if (list->head == NULL){list->head = node;list->tail = node;}else{//队尾的下一个节点为新创建的节点list->tail->next = node;//更改队尾节点的指向list->tail = node;}//队列有效元素个数加一list->size++;
}

         4、出队列

         时间复杂度:O( 1 ) 

        删除头节点,并更新头节点为头节点的下一个节点, 因此时间复杂度为O( 1 )

//队列——删除
void queuepop(struct queue* list)
{//队列不能为空if (list->head == NULL){assert(list->head);}//保存对头的下一个节点struct queuenode* cur = list->head->next;//删除队头free(list->head);//更改对头的指向list->head = cur;//当对头为空时,队尾也要为空if (cur == NULL){list->tail = NULL;}//队列有效元素减一list->size--;
}

         5、取队头数据

         时间复杂度:O( 1 ) 

        这里有维护头节点,直接返回头节点数据,因此时间复杂度为O( 1 )

//队列——返回对头数据
int queuefront(struct queue* list)
{//队列不能为空if (list->head == NULL){assert(list->head);}//返回对头数据return list->head->data;
}

         6、取队尾数据

        时间复杂度:O( 1 )  

        这里有维护尾节点,直接返回头节点数据,因此时间复杂度为O( 1 ) 

//队列——返回队尾数据
int queueback(struct queue* list)
{//队列不能为空if (list->tail == NULL){assert(list->tail);}//返回队尾数据return list->tail->data;
}

         7、队列判空

         时间复杂度:O( 1 )  

        判断队列中的有效元素个数是否为0 

//队列——判断队列是否为空
int queueempty(struct queue* list)
{//队列——判断队列是否为空if (list->head == NULL){return 0;}else{return 1;}
}

         8、队列中有效元素个数

        时间复杂度:O( 1 )  

         这里有维护队列中有效元素个数,直接返回,因此时间复杂度为O( 1 )

//队列——返回队列有效元素个数
int queuesize(struct queue* list)
{//返回答案return list->size;
}

 练习题目链

        数据结构最好的巩固就是写算法题目也是最好的体现,学习了不代表学会了,一定要加以实践

        20. 有效的括号 - 力扣(LeetCode) 

        225. 用队列实现栈 - 力扣(LeetCode) 

        232. 用栈实现队列 - 力扣(LeetCode)

        155. 最小栈 - 力扣(LeetCode) 

        更多的可以在力扣上写: 力扣 (LeetCode) 全球极客挚爱的技术成长平台

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

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

相关文章

(一)Mysql篇---Mysql整体架构

MySql框架浅析 首先,上一张图先让各位看看大致结构: 从上到下,依次说一下结构: 连接层:这里主要是处理客户端和数据库连接的,直接使用的Tomcat的连接池,可以调整最大连接数; 服务…

精益思维在新能源汽车研发中的应用体现

近年来,新能源汽车作为绿色出行的重要载体,其研发与生产模式正经历着深刻的变革。精益思维,这一源自制造业的管理理念,正逐步渗透并深刻影响着新能源汽车的研发过程,不仅提升了产品质量与生产效率,还促进了…

汽车级DC-DC转换器英飞凌TLF35584

上汽荣威都在用的汽车级DC-DC转换器英飞凌TLF35584 今天平台君从IPBrain数据库中给大家带来的一款由Infineon(英飞凌)推出的一款多路输出安全电源芯片,具备高可靠性和安全性。适用于汽车电子系统中的多种应用场景,如车身控制、安全气囊、防抱死制动系统,电子稳定控制系统等。…

数据结构:堆的应用

堆排序 假定有一组数据极多的数,让我们进行排序,那我们很容易想到一种经典的排序方法,冒泡排序,我们对冒泡排序的时间复杂度进行分析: 显然,冒泡排序的时间复杂度是O(n^2),当数据量…

软考(中级-软件设计师)计算机系统篇(1024)

#1024程序员节|正文# 六、树和二叉树 6.1 树的基本概念 描述结果结点的度子结点的个数树的度最大结点的度叶子结点没有子结点的结点内部结点除根结点和叶子结点外的结点父节点有子结点的结点子节点有父结点的结点兄弟节点有同一个父结点的结点层次4层 6.2 二叉树的基本概念…

【Javaee】网络原理—TCP协议的核心机制

前言 TCP/IP五层协议是互联网中的主流模型,为网络通信提供了一个稳固的框架。 主要包含了应用层,传输层,网络层,数据链路层,物理层。 本篇主要介绍传输层的TCP协议的核心机制 一. 确认应答(ack&#xf…

线程本地变量-ThreadLocal

一、ThreadLocal简介 ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可…

量子纠错--shor‘s 码

定理1 (量子纠错的条件) C是一组量子编码,P是映射到C上的投影算子。假设是一个算子元素描述的量子操作,那么基于量子编码C,存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…

[C++进阶数据结构]红黑树(半成品)

我们讲完了AVL树,它追求绝对平衡,从而导致插入和删除性能较差。今天我们来讲讲,红黑树,它是另一种平衡二叉搜索树,它追求相对平衡,使得增删查改的性能都极佳,时间复杂度皆为O(log2N)。 一、红黑树的概念 …

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

Ribbon客户端负载均衡策略测试及其改进

文章目录 一、目的概述二、验证步骤1、源码下载2、导入IDE3、运行前修改配置4、策略说明5、修改策略 三、最终结论四、改进措施1. 思路分析2. 核心代码3. 测试页面 一、目的概述 为了验证Ribbon客户端负载均衡策略在负载节点失效的情况下,是否具有故障转移的功能&a…

【逆向基础】十七、PE文件格式(二)

一、简介 本篇章主要PE文件组成部分中使用的结构体;根据结构体的成员变量去了解各个字节的含义。(ps:我们依旧以”cmd.exe“为例展开解析;) 二、DOS Header 1、结构体:IMAGE_DOS_HEADER IMAGE_DOS_HEADER结构体的背景是为了兼…

忘记7-zip文件7-zip文件,还可以解压zip文件吗?

文件压缩与解压已成为我们日常处理数据和存储信息的常规操作。7-Zip,作为一款开源且功能强大的文件压缩工具,凭借其高压缩率、支持多种格式以及免费使用的特点,赢得了广大用户的青睐。然而,出于保护文件内容安全的考虑&#xff0c…

基于NVIDIA NIM平台—生成属于自己的DIY食谱

目录 一、介绍NVIDIA NIM平台 二、生成DIY食谱Demo 三、小结 一、介绍NVIDIA NIM平台 NVIDIA NIM(Nvidia Inference Microservices)平台是NVIDIA推出的一个微服务套件,旨在加速生成式AI模型在云端、数据中心和工作站上的部署和使用。以下是…

怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质

主谓宾与主系表是英语句子结构中的两种基本类型,它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下: 关注点 主谓宾I love you:主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为,通常描…

4K双模显示器7款评测报告

4K双模显示器7款评测报告 HKC G27H7Pro 4K双模显示器 ROG华硕 XG27UCG 4K双模显示器 雷神 ZU27F160L 4K双模显示器 泰坦军团 P275MV PLUS 4K双模显示器 外星人(Alienware)AW2725QF 4K双模显示器 SANC盛色 D73uPro 4K双模显示器 ANTGAMER蚂蚁电竞 …

MySql中表的约束

​ 本篇中将会介绍关于 MySql 数据库中的表的约束,关于表的约束其实约束的是表中的数据类型,因为有的数据类型很单一,需要我们添加一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性&#xf…

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

leetCode算法题爬楼梯递归写法

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2输出&#xff1a;2解释&#xff1a;有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

GPIO输入和输出

参考视频&#xff1a;2.1 [GPIO]4种输出模式_哔哩哔哩_bilibili 输出&#xff1a;通过写0或者写1&#xff0c;控制引脚输出低电压或高电压。 输入&#xff1a;通过读取引脚是0还是1&#xff0c;判断引脚输入的是高电压还是低电压。 输出 推挽开漏通用通用输出推挽通用输出开漏…