队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

一个队列为z=(a1,a2,…,an), 如图

那么a1为对头元素,an为队尾元素。最早进入队列的元素也会最早出来,只有当最先进入队列的元素都出来以后,后进入的元素才能退出。

在日常生活中,人们去银行办理业务需要排队,这就类似我们提到的队列。每一个新来办理业务的需要按照机器自动生成的编号等待办理,只有前面的人办理完毕,才能轮到排在后面的人办理业务。新来的人进入排队状态就相当于入队,前面办理完业务离开的就相当于出队。
队列有两种存储表示:顺序存储和链式存储。采用顺序存储结构的队列被称为顺序队列,采用链式存储结构的队列称为链式队列。

基本运算

InitQueue()     ——初始化队列
EnQueue()        ——进队列
DeQueue()        ——出队列
IsQueueEmpty()   ——判断队列是否为空
IsQueueFull()    ——判断队列是否已满

顺序队列

由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素。

队列为空时,队头指针front和队尾指针rear都指向下标为0的存储单元,当元素a,b,c,d,e,f,g依次进入队列后,元素ag分别存放在数组下标为06的存储单元中,队头指针front指向元素a,队尾指针指rear向元素g的下一位置。如图所示。

假溢出

在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。解决假溢出的途径———采用循环队列。

例如在图中队列删除a和b,然后依次插入h、i和j,当插入j后,就会出现队尾指针rear越出数组的下界造成“假溢出”,如图

顺序循环队列

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。即:循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0。

队空和队满

在循环队列中,队空和队满时队头front和队尾指针rear同时都会指向同一存储单元,即front==rear,如图所示。

队空

队满

如何区分队空和队满呢?有以下两种方法:

(1)增加一个标志位。设标志位为tag,初始时,tag=0;当入队成功,则tag=1;出队成功,tag=0。则判断队空的条件为:frontrear&&tag0;队满的条件为:frontrear&&tag1;

(2)少用一个存储单元。队空的判断条件为frontrear;队满的判断条件为front(rear+1)%QueueSize。
队满的状态如图。

存储结构

#define  MAXQSIZE  5 // 存储空间的初始分配量
typedef struct {ElemType *base;int front;int rear;int maxSize;
} SqQueue;

基本运算

初始化

Status InitQueue(SqQueue &Q) {//分配存储空间Q.base = (ElemType*)malloc(MAXQSIZE * sizeof(ElemType));if(!Q.base)   exit(OVERFLOW);//置Q为空队列Q.front = Q.rear = 0;Q.maxSize = MAXQSIZE;return OK;
}

判队列是否为空

Status QueueEmpty(SqQueue Q) {if(Q.rear == Q.front) return TRUE;else return FALSE;
}

入队函数

Status EnQueue(SqQueue &Q, ElemType e) {if((Q.rear + 1) % MAXQSIZE == Q.front)//队列已满return ERROR;Q.base[Q.rear] = e;//插入队尾Q.rear = (Q.rear + 1) % MAXQSIZE;//尾部指针后移,如果到最后则转到头部return OK;
}

出队函数

Status DeQueue(SqQueue &Q, ElemType &e) {if(Q.front == Q.rear)   //队列空return ERROR;//返回队头元素e = Q.base[Q.front];    //队头指针后移,如到最后转到头部Q.front = (Q.front + 1) % MAXQSIZE; return OK;
}

输出循环队列函数

void OutQueue(SqQueue Q) {   ElemType e;if(QueueEmpty(Q)){printf("这是一个空队列!");} else {while(!QueueEmpty(Q)){DeQueue(Q, e);printf("%6d", e);}printf("\n");}
}

输出循环队列长度

Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

销毁队列

Status ClearQueue(SqQueue Q) {///销毁队列Q,Q不再存在if(Q.base)free(Q.base);Q.base = NULL;Q.front = Q.rear = 0;return OK;
}

主函数

int main() {     SqQueue q;int cord; ElemType a;printf("第一次使用必须初始化!\n");//调用初始化算法InitQueue(q); do{printf("\n 主菜单 \n");printf(" 1 初始化循环队列 ");printf(" 2 进队一个元素 ");printf(" 3 出队一个元素 ");printf(" 4 队列长度 ");printf(" 5 销毁队列 ");printf(" 6 结束程序运行 ");printf("\n------------------------------------------------------------------\n");printf("请输入您的选择( 1, 2, 3, 4, 5, 6)");scanf("%d", &cord);printf("\n");switch(cord) {case 1:InitQueue(q); //调用初始化算法;OutQueue(q);break;case 2:printf("请输入要插入的数据元素:a=");scanf("%d", &a);EnQueue (q, a); //调用进队算法;printf("%d 进队之后的队列:",a);OutQueue(q);break;case 3:DeQueue (q, a); //调用出队算法;printf("队头元素 %d 出队之后的队列:", a);OutQueue(q);break;case 4:printf("该队列长度为: %d", QueueLength(q));break;case 5:ClearQueue(q);break;case 6:exit(0);}} while(cord <= 4);return 0;
}

队列(常用数据结构之一)相关推荐

  1. 【转】常用数据结构及复杂度

    常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) Linked list ( ...

  2. 动图 + 源码,演示 Java 中常用数据结构执行过程及原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  3. 几张动态图捋清Java常用数据结构及其设计原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  4. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  5. 【Python基础】盘点 Python 10 大常用数据结构(下篇)

    我的施工之路 虽然艰辛,却有读者们陪伴 Python 常用数据结构 此专题<盘点Python10大常用数据结构>目录: 学习目的 学习目标 1 list 2 tuple 3 set 4 d ...

  6. 【数据结构与算法-1】常用数据结构

    常用数据结构 每种数据结构都可以用线性和非线性结构实现 栈 stack 队列 queue 堆 heap

  7. Python机器视觉编程常用数据结构与示例

    Python机器视觉编程常用数据结构与示例 本文总结了使用Python进行机器视觉(图像处理)编程时常用的数据结构,主要包括以下内容: 数据结构 通用序列操作:索引(indexing).分片(slic ...

  8. 常用数据结构及复杂度

    来自:匠心十年 - 博客园  作者:Dennis Gao  链接:http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data ...

  9. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...

    程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...

最新文章

  1. html 图片时钟,教你五步制作精美的HTML时钟
  2. xmanager 开启X11转发失败问题解决
  3. 多线程问题导致的JDBMonitor的bug分析
  4. 条件 CHAIN 语句
  5. php 简易 blog,PHP实现简易blog的制作
  6. 传统关系型数据库性能优化全攻略
  7. 算法笔记:简单的字符串模式匹配-BF算法
  8. pcie标准_24Pin接口再见!华擎推出首款ATX12VO标准的Z490主板
  9. 3.Jenkins 权威指南 --- 设置构建作业
  10. 精业科技(天津)有限公司 Game Over
  11. 服务器定时关机 修改时间,服务器调定时关机
  12. 威纶通触摸屏制作自定义弹出窗口的具体方法(3种)
  13. 科技爱好者周刊(第 181 期):移动支付应该怎么设计?
  14. uniapp安卓创建桌面快捷方式
  15. 【CLR】程序集查找与GAC
  16. 这些道理不懂,你注定就是穷打工的命
  17. thrift夸语言编程,facebok
  18. vue页面详情页返回列表页_vue列表页进入详情页,返回列表项不刷新
  19. 如何用 Python 爬取需要登录的网站?
  20. 全国计算机等级考试excel公式,全国计算机等级考试Excell公式大全

热门文章

  1. 搞科研、学术的朋友注意了,停下手头的活,再忙也要看一下这个!
  2. 爬虫笔记9实例股票数据
  3. matlab 变长参数,变长参数函数的概念
  4. 05丨深入浅出索引(下)
  5. python bosonnlp_BosonNLP分词技术解密
  6. 2021青海高考文综成绩查询,2021年青海高考分数线预测 文理科录取分数线预测
  7. android 8 ril,Android系统启动——8 附录2:相关守护进程简介
  8. spring-aop相关概念
  9. RStudio(You‘re using a non-UTF8 locale, therefore only ASCII characters will work)
  10. 《移动应用开发》实验报告——仿饿了么商家页面