数据结构——“队列 队列的应用“ 详细图解和代码示例 (没更新完)
队列
- 队列的概念
- 什么是队列
- 队列的特征
- 队列——顺序存储
- 队列顺序存储基本算法分析
- 队列顺序存储基本算法实现
- 顺序队应用
队列的概念
队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”
,允许进行删除操作的一端称为“队头”
。当线性表中没有元素时,称为“空队
”。
特点 ;先进先出(FIFO)。
什么是队列
我们先举一个售票处的例子:有两个栏杆挡着进入窗口进行买票,一个接一个的从栏杆后进去,在栏杆内等待,这起到公平工公正的作用,防止了插队。但是有一个坏处是,如果你尿急但还在栏杆中, 你是不能出去的,只能忍着等到你买完后从护栏前面出去
银行一进来很豪华是吧,没有像这样的弄两个栏杆子,它门口会有一个叫号器,那么这个东西干什么呢?这个东西啊它非常关键也非常重要,对我们来说呢,比售票处要先进一点,或者说对我们每个人来说呢,能够节约我的时间。
你原来你进来是不是要排队啊?你排队这里你在这个在那里面想出去,前面有人想想想从后面出去不行,是不是挡着。现在就不同了,你一进来啊要办理业务,一进来的话,先不管三七二十一,先取个号,取个号的话呢,这个时候你就爱干嘛干嘛了,我们等着。然后呢这边这个工作人员他如果说前面的办理完,办理完业务了没人了,他就会按一下那个有个按钮按一下某某某号,那这时候呢你就可以进去办理业务,那么你在这个时间的话呢,你就不用说是在这儿排队等了,你上厕所不影响
那么注意这个起取号器谁做的里面要不要程序呢?需要的是不是里面的程序是怎么做的?什么样的一个思路呢?那这其实就是什么利用了我们这个数据结构的队列的这个思想,
其实上面的两种案例都体现了一个队列这么一个概念。
队列的特征
特殊的线性表,先进先出(FIFO)
- 数据:
对于非空的队列,表头没有直接前驱,表尾没有直接后继,其它有且仅有一个直接前驱和一个直接后继。 - 操作:
只允许在表尾插入数据,在表头删除数据。
队列——顺序存储
顺序存储怎么存,它的特点是什么呢?逻辑上的先后次序把他们依次的存储在一块连续的空间里面。这是我们说的顺序的这个特点啊,那么我们如何去存呢?
首先得有这样一个结构的数据,那么我们要将这组数据存在连续存的空间里面,显然我们先要申请一块连续空间,进而才能存储,所以对列的顺序里面要有一块连续的空间。
然后呢,我们要有front,rear两个数据的空间,我们就可以通过这两个数据来确定我这个队列中有多少个元素,那么要出队的话,通过的front来进行出队,那么入队的话,我们通过rear入队。
front 和rear 其实起到一个非常重要的数据管理作用,所以我们通常把他们两个数据和我们这个存储数据的空间,给它封装在一起。
在c语言中,封装数据用结构体,封装代码用函数。
定义队列结构体
#define MAXSIZE 64 //定义队列的容量
typedef int datatype; //定义队列中数据元素的数据类型
typedef struct
{ datatype data[MAXSIZE]; //用数组作为队列的存储空间int front,rear; //指示队头前一个位置和队尾位置的指针
}sequeue; //顺序队列类型定义
sequeue *sq; //定义指向顺序队列的指针
这些数据结构,链表,栈,队列等都作为一个工具,
它第一:可以存储数据,
二:管理(处理)数据。
队列顺序存储基本算法分析
初始化
申请顺序队列的空间:malloc
确定front和rear的位置。(空队列时,让front = rear= -1
)入队
一:rear++
二:data[rear]=value;
三:若空间满了,再入队,就不行了没空间了if(rear == MAXSIZE-1)
改进:
一:rear=(rear+1)%MAXSIZE
二:data[rear]=value;
出队
一:front++
二:data[front] ->出队
三:(假溢出
)若空间没有元素了或者只有一个元素了,front=5,正常我们应该还能入队,还有空间,但是rear=6,还是队满的。就矛盾了。
改进:
一:front=(front+1)%MAXSIZE
二:data[rear]=value;
判断队空
判断队满
队列顺序存储基本算法实现
创建队列
两种创建队列的方法,只是返回的不同
#include"sequeue.h"seq_pqueue init_sequeue(){seq_pqueue q;q = (seq_pqueue)malloc(sizeof(seq_queue));if(q == NULL){perror("malloc");exit -1;}q->front = q->rear = MAXSIZE-1;return q;
}******************************************************
void init_sequeue(seq_squeue *Q){*Q = (seq_pqueue)malloc(sizeof(seq_queue));if((*Q) == NULL){perror("malloc");exit -1;}(*Q)->front = (*Q)->rear = MAXSIZE-1;return *Q;
}
判断队满
bool is_full_sequeue(seq_sequeue(q)){if((q->rear+1)%MAXSIZE == q->front){return true;}else{return false;}
}
入队操作
bool in_squeue(datatype value , seq_sequeue q){//判断队列是否为满if(is_full_sequeue(q)){printf("sequeue is full\n");return false;}//入队q->rear = (q->rear+1)%MAXSIZE;q->data[q->rear] = data;return true;
}
判断队空
bool is_empty_sequeue(seq_sequeue(q)){if(p->rear == p->front){return true;}else{return false;}
}
出队操作
bool out_sequeue(seq_sequeue q ,datatype *D){//判断队列是否为空if(is_empty_sequeue(q)){printf("sequeue is empty\n");return false;}//出队q->rear = (q->rear+1)%MAXSIZE;*D = q->data[q->front];return frue;
}
顺序队应用
-------------------------------------------------很棒学习完了数据结构的 队列--------------------------------------------------
------------------------------------------------------------下期预告:二叉树------------------------------------------------------
数据结构——“队列 队列的应用“ 详细图解和代码示例 (没更新完)相关推荐
- 【OS系列-2】- 进程详细讲解(代码示例)
进程 进程详细讲解(代码示例) 进程 示例代码 创建进程的具体过程? 执行 fork()的时候系统做了什么? 进程间通信 管道 消息队列 共享内存 信号量 套接字 进程间同步 信号量 文件锁 无锁 C ...
- python pyqt教程_python使用PyQt5的详细教程(代码示例)
本篇文章给大家带来的内容是关于python使用PyQt5的详细教程(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:安装PyQt5pip install pyqt5 二 ...
- 数据结构 —— 单链表(超详细图解 接口函数实现)
系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...
- JDK7新特性详细说明及代码示例
在2011年7月28日,Oracle发布了JDK7的正式版.最近我从网上搜集了一些资料,把文字说明和代码示例结合起来,方便我们的学习. 下面我们来看看JDK7比6多了哪些新特性 1.访问文件系统 与之 ...
- 数据结构(严蔚敏C语言版)代码实现持续更新中
文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...
- 【手写数据结构】双链表最详细图解
原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的一键三连! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以 ...
- 【学习笔记】rabbitmq设置队列ttl和使用延迟插件的代码示例
文章目录 设置队列ttl 配置文件 生产者 消费者 设置消息ttl 延迟插件的使用 修改配置文件 修改生产者 修改消费者 设置队列ttl 代码架构: 创建两个队列QA和QB,两者队列TTL分别设置为1 ...
- Spark数据倾斜-采样倾斜key并分拆join操作-详细图解与代码
本文修改自[1]中的方案六. 下面的方案简述来自[1] 方案适用场景:两个RDD/Hive表进行join的时候,如果数据量都比较大,无法采用"解决方案五",那么此时可以看一下两个R ...
- 冒泡排序(超详细图解加代码解析,5分钟看懂)
目录 1.冒泡排序的定义 2.冒泡排序的原理 3.代码及其解析 4.冒泡排序的改进 5.实现冒泡排序函数 生命中永远会有令人懊恼的事,但我知道,我们是为了不留遗憾活着的,对吗? 1.冒泡排序的定义 冒 ...
- SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)
准备工作# 环境准备# JAVA版本 Copy java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1. ...
最新文章
- apk反编译工具-apktool
- lamp 独立mysql_lamp or lnmp 环境搭建之独立安装mysql数据库
- PAT甲级1073 Scientific Notation:[C++题解]字符串处理、科学计数法
- BZOJ4127Abs——树链剖分+线段树
- 向量合并 matlab,MATLAB追加向量
- 让我们了解下什么是智能客服(问答)
- Visual Studio Code中的无标题(工作区)
- 教你正确设置CrossOver的Wine配置(三)
- 日语输入法电脑版_攻略!教你如何用手机打日语
- Java容器---List
- RS232和RS485的协议原理及应用
- css 平移到某个位置_CSS3 对象平移translate()translatex()translatey()应用实例,包括水平垂直居中...
- MathType批量修改公式字体和大小
- HDOJ 5144 NPY and shot 简单物理
- 绪论——信息理论学与量子信息学
- 记Global Protect安装的一次坑旅
- 万达VS银泰 谁是最后的赢家?
- Day462.MySQL数据类型约束 -mysql
- unity打开word pdf 等其他格式
- 个人账目管理系统(一)数据库连接
热门文章
- 使用EasyExcel的模板导出复杂表头的Excel- 先单组数据填充,再多组数据填充
- 中国科学家dna计算机,我国首台DNA计算机问世
- Arcgis空间连接
- itext linux 中文乱码_itext linux 中文
- c语言中char ch和getchar()是什么意思?
- 使用手册 煤矿风险管控系统_煤矿风险分级管控手册.doc
- 自控力 笔记10 结语 完结篇
- IE主页被https://hao.360.cn/?a1004劫持,如何解决
- 你用过Foxpro吗?
- SQL查询左连接、右连接、内连接