[C++STL] 队列 queue 的入门
队列结构
概念:
队列(queue):和栈相似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时成为空队列。
队列结构采取“先进先出”的原则处理结点数据。
分类:
以存储结构划分,分为两类:
顺序队列结构
使用一组地址连续的内存单元依次保存在队列中的数据。在程序中,可以定义一个指定大小的结构数组来作为队列。
链式队列结构
使用链表形式保存队列中各元素的值
队列的基本操作:
入队列:将一个元素添加到队尾(相当于到队列最后等候)
出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。
队列的程序设计
准备数据:
准备在队列操作中要用到的变量以及数据结构
#define QUEUELEN 15
typedef struct
{ char name[10];
int age;
}DATA;
typedef struct
{
DATA data[QUEUELEN]; //队列数组
int head;
int tail;
}SQType;
这里定义了队列结构的最大长度QUEUELEN,队列结构数据元素的类型DATA以及队列结构的数据结构 SQType 。在数据结构 SQType 中,data 为数据元素,head 为队头的序号,tail 为队尾的序号。当 head=0 时表示队列为空,当 tail=QUEUELEN 时表示队列为满。
初始化队列结构:
创建一个空的顺序队列。步骤如下:
按符号常量 QUEUELEN 指定的大小申请一块内存空间,用来保存队列中的数据。
设置 head=0 和 tail=0 ,表示是一个空栈。
初始化顺序队列的示例代码如下:
SQType* SRTpyeInit()
{
SQType* q;
if (q = (SQType*)malloc(sizeof(SQType))) //申请内存
{
q->head = 0; //设置队头
q->tail = 0; //设置队尾
return q;
}
else
{
return NULL; //返回空
}
}
这里采用 malloc() 申请内存,申请成功后设置队头和队尾,返回申请内存的首地址。如果申请内存失败,将返回 NULL 。
判断队列:
判断空队列
int SQTypeIsEmpty(SQType* q)
{
int temp;
temp = q->head == q->tail;
return temp;
}
在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,根据队列 head 是否等于 tail ,判断队列是否为空。
判断满队列
int SQTypeIsFull(SQType* q)
{
int temp;
temp = q->tail == QUEUELEN;
return temp;
}
在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,根据队列 tail 是否等于符号常量QUEUELEN ,判断队列是否为满。
清空队列:
void SQTypeClear(SQType* q)
{
q->head = 0; //设置队头
q->tail = 0; //设置队尾
}
在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,将队列顶指针 head和 tail 设置为 0,表示执行清空队列操作。
释放空间:
释放队列结构所占用的内存单元。由前面可知,在初始化队列结构时,使用了 malloc() 函数分配内存空间。虽然可以使用清空队列的操作,但是清空队列操作并没有释放内存空间,所以需要用 free() 释放所分配的内存。
void SQTypeFree(SQType* q)
{
if (q != NULL)
free(q);
}
在这里,输入一个参数 q 为一个指向操作的队列的指针。程序中,直接调用 free() 释放所分配的内存。多用于程序结束时。
出入队列:
入队列
将数据元素保存到队列结构。具体步骤如下:
首先判断队列顶 tail,如果 tail 等于QUEUELEN,则表示溢出,进行出错处理。
设置 tail=tail+1 (队列顶指针+1,指向入队列地址)
将队列元素保存到 tail 指向的位置。
代码示例:
int InSQType(SQType* q,DATA data)
{
if (q->tail == QUEUELEN)
{
printf("队列已满操作失败!\n");
}
else
{
q->data[q->tail++] = data; //将元素入队列
return 1;
}
}
出队列
从队列顶弹出一个数据元素。具体步骤如下:
判断队列 head,如果 head 等于 tail,则表示为空指针,进行出错处理。
从队列首部取出队头元素(返回队头元素的指针)
设修改队头 head 的序号,使其指向后一个元素。
代码示例:
DATA* OutSQType(SQType* q)
{
if (q->tail == q->tail)
{
printf("队列已空,操作失败!\n");
exit(0);
}
else
{
return &(q->data[q->head++]);
}
}
读取结点数据
与出队列不同,读结点的操作只是显示内容,而出队列会使该数据不再存在。
代码示例:
DATA* OutSQType(SQType* q)
{
if (SQTypeIsEmpty(q))
{
printf("空队列!\n");
return NULL;
}
else
{
return &(q->data[q->head]);
}
}
在这里,输入一个参数 q 为一个指向操作的队列的指针。程序返回值同样是一个(指向 DATA 类型的指针数据的)指针。
制作:BDT20040
[C++STL] 队列 queue 的入门的更多相关文章
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
- STL中的单向队列queue
转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...
- Windows Azure Service Bus (2) 队列(Queue)入门
<Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...
- STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较
栈stack .队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...
- STL中队列queue的用法
头文件:#include <queue> 建立一个队列queue < 类型 > q 加入一个新的元素q.push(a) 询问队首元素q.front() 弹出队首元素q.pop( ...
- Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
<Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...
- Gengxin讲STL系列——Queue和Stack
第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...
- STL之Queue(Q)
STL的Queue(数据结构中的队列): 特点:FIFO 先进先出: 自适应容器(即容器适配器) 栈适配器STL queue STL中实现的Queue: 用list来实现queue: queue ...
随机推荐
- 四、PCB初始化设置
1.参数设置Setup-Design Parameters 2.显示设置 3.颜色设置(自定义) 4..栅格设置(走线层将25分为5等份)
- Python函数-导入模块的顺序及原理
引入 当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这 ...
- [转载] Link prefetch
本来想翻译的但是有人翻译了,还是转过来吧.原文<HTML5 Link Prefetching>,译文<使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载 ...
- 使用jquery-webcam插件,实现人脸采集并转base64
项目需求:在ie或chrome浏览器下,调用电脑摄像头(确保使用的是笔记本电脑,或者摄像头功能正常使用的台式机),进行人脸图像采集预览,并将图片的base64码传入到后台进行后续操作.该demo适用于 ...
- 让你熟知jquery见鬼去吧
$是jquery最具代表的符号,当然php也是,但是二者不能同日而语;不得不说jquery的选择器是大家赞不绝口的,在它1.x版本中对ie兼容性是最好的,这要归功于$选择器; 现在呢,html5的降临 ...
- HTML表格CSS美化
效果展示 style.css html{ width: 100%; height: 100%; overflow: hidden;}body{ width: 100%; height: 100%; f ...
- 实现call、apply 及 bind 函数
今日学习内容: (1)call 函数的实现步骤: 判断调用对象是否为函数,即使是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况. 判断传入上下文对象是否存在,如果不存在,则设置为 ...
- spring原始注解(value)-03
本博客依据是是spring原始注解-02的代码 注入普通数据类型:@Value注解的使用 1.添加driver属性,使用value注解 @Service("userService" ...
- Java学习day27
今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...
- Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务
前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...