队列:是指只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,这与栈的后进先出正好相反;其中允许插入的一端我们称为队尾,允许删除的一端我们称为队头(或队首)。假设队列Q=(a1,a2,......an),那么a1就是队头元素,an就是队尾元素;我们删除数据时,总是从队头元素a1开始,而插入数据时,则是从队尾元素an后面开始插入,这也比较符合我们生活中的习惯,排在第一的当然优先出列,后来的当然排在队伍的后面。

  线性表有顺序存储和链式存储,栈是线性表,所以也有这两种存储方式。同样的,队列作为一种特殊的线性表,也有这两种存储方式。下面,我们先来看看队列的顺序存储结构。

  我们假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元中,数组下标为0的一端即为队首。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此它的时间复杂度为0(1)。与栈不同的是,队列元素的出队列在队头,这也就意味着,队列中所有元素都得向前移动,以保证队列队头元素不为空,即数组下标为0的位置不为空,此时的时间复杂度为0(n)。在现实中也是如此,比如说一群人在排队买票,前面的人买好了票就离开,后面的人则向前一步,补上前面的空位。

  通常我们为了避免当只有一个元素时,队头与队尾重合使操作变得麻烦,所以引入了两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front=rear时,此队列不是只剩下一个元素,而是一个空队列。若设队列的长度为QueueSize,则通用的计算队列的长度公式为:(rear-front+QueueSize)%QueueSize。接下来我们重点看一下队列的插入、删除等操作是怎样实现的,具体操作源程序代码如下所示:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define OK 1
  5 #define ERROR 0
  6 #define TRUE 1
  7 #define FALSE 0
  8
  9 #define MAXSIZE 10                /* 存储空间初始分配量 */
 10
 11 typedef int Status;
 12 typedef int QElemType;             /* QElemType类型根据实际情况而定,这里假设为int */
 13
 14 /* 循环队列的顺序存储结构 */
 15 typedef struct
 16 {
 17     QElemType data[MAXSIZE];
 18     int front;                   /* 头指针 */
 19     int rear;                    /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
 20 }SqQueue;
 21
 22 Status visit(QElemType c)
 23 {
 24     printf("%d ",c);
 25     return OK;
 26 }
 27
 28 /* 初始化一个空队列Q */
 29 Status InitQueue(SqQueue *Q)
 30 {
 31     Q->front=0;
 32     Q->rear=0;
 33     return  OK;
 34 }
 35
 36 /* 将Q清为空队列 */
 37 Status ClearQueue(SqQueue *Q)
 38 {
 39     Q->front=Q->rear=0;
 40     return OK;
 41 }
 42
 43 /* 返回Q的元素个数,也就是队列的当前长度 */
 44 int QueueLength(SqQueue Q)
 45 {
 46     return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
 47 }
 48
 49 /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
 50 Status GetHead(SqQueue Q,QElemType *e)
 51 {
 52     if(Q.front==Q.rear)     /* 队列空 */
 53         return ERROR;
 54     *e=Q.data[Q.front];
 55     return OK;
 56 }
 57
 58 /* 若队列未满,则插入元素e为Q新的队尾元素 */
 59 Status EnQueue(SqQueue *Q,QElemType e)
 60 {
 61     if ((Q->rear+1)%MAXSIZE == Q->front)    /* 队列满的判断 */
 62         return ERROR;
 63     Q->data[Q->rear]=e;                     /* 将元素e赋值给队尾 */
 64     Q->rear=(Q->rear+1)%MAXSIZE;            /* rear指针向后移一位置, */
 65                                             /* 若到最后则转到数组头部 */
 66     return  OK;
 67 }
 68
 69 /* 若队列不空,则删除Q中队头元素,用e返回其值 */
 70 Status DeQueue(SqQueue *Q,QElemType *e)
 71 {
 72     if (Q->front == Q->rear)                /* 队列空的判断 */
 73         return ERROR;
 74     *e=Q->data[Q->front];                   /* 将队头元素赋值给e */
 75     Q->front=(Q->front+1)%MAXSIZE;          /* front指针向后移一位置, */
 76                                             /* 若到最后则转到数组头部 */
 77     return  OK;
 78 }
 79
 80 /* 从队头到队尾依次对队列Q中每个元素输出 */
 81 Status QueueTraverse(SqQueue Q)
 82 {
 83     int i;
 84     i=Q.front;
 85     while((i+Q.front)!=Q.rear)
 86     {
 87         visit(Q.data[i]);
 88         i=(i+1)%MAXSIZE;
 89     }
 90     printf("\n");
 91     return OK;
 92 }
 93
 94 int main()
 95 {
 96     SqQueue Q;
 97     QElemType e;
 98     Status i;
 99     int j,k=0;
100
101     i=InitQueue(&Q);
102     printf("1.初始化队列Q后,队列Q的长度为:Q.length=%d\n",QueueLength(Q));
103
104     printf("2.请输入整型队列元素(不超过%d个),-1为提前结束符: \n",MAXSIZE-1);
105     do
106     {
107         e=k+10;
108         if(e==-1)
109             break;
110         k++;
111         EnQueue(&Q,e);
112     }while(k<MAXSIZE-1);
113
114     printf("3.连续%d次由队头删除元素,队尾插入元素:\n",MAXSIZE);
115     for(j=1;j<=MAXSIZE;j++)
116     {
117         DeQueue(&Q,&e);
118         printf("删除的元素是%d,插入的元素:%d \n",e,j+100);
119         e=j+100;
120         EnQueue(&Q,e);
121     }
122
123     printf("4.现在队列中的元素为: \n");
124     QueueTraverse(Q);
125
126     printf("5.现在队列Q的长度为:Q.length=%d\n",QueueLength(Q));
127
128     DeQueue(&Q,&e);
129     printf("6.在队列Q的队头处删除元素后:Q.data=");
130     QueueTraverse(Q);
131
132     GetHead(Q,&e);
133     printf("7.现在队列Q的队头元素是:%d\n",e);
134
135     i=ClearQueue(&Q);
136     printf("8.将队列Q清空后,队列Q的长度为:Q.length=%d\n",QueueLength(Q));
137
138     return 0;
139 }

转载于:https://www.cnblogs.com/mix88/p/6171799.html

浅谈数据结构之顺序队列(五)相关推荐

  1. 袁萌浅谈C919大飞机(五)

    袁萌浅谈C919大飞机(五) 大家已经知道,C919大飞机是我们中国人自主"集成制造"的,而不是组装的大飞机.集成与组装是两个不同的概念. 设计C919大飞机机翼的横断面是很有学问 ...

  2. 浅谈数据结构和数据类型

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012540337/article/details/80499226 最近总是被这两个概念混淆,抽出 ...

  3. 【数据结构】顺序队列的实现(C语言)

    队列的基本概念及其描述 队列是一种特殊的线性表,它的特殊性在于队列的插入和删除操作分别在表的两端进行. 插入的那一端称为队尾,删除的那一端称为队首.队列的插入操作和删除操作分别称为进队和出队. 先进先 ...

  4. 数据结构之顺序队列和链式队列常用的一些操作

    顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表.和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素.由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示 ...

  5. 数据结构之顺序队列的优化

    顺序队列的优化 我们既然想优化顺序队列,首先得知道目前顺序队列的瓶颈在哪里,那样才能对症下药. 顺序队列的瓶颈: 1.线性表的第一个元素作为队头,线性表的最后一个元素作为队尾: 2.入队的新元素是在线 ...

  6. (c语言数据结构)用顺序队列的方式实现输入12345,输出12345操作——期末数据结构程序设计

    用顺序队列的方式实现输入123456,输出12345操作 文章目录 用顺序队列的方式实现输入123456,输出12345操作 1.队列的定义 2.队列的初始化 3.判空操作 4.入队操作 5. 出队操 ...

  7. 【浅谈数据结构】《数据结构》Data Structure

    <数据结构>60' 一.栈(stack).队列(Queue).向量(Vector) 1.链表 带哨兵节点链表了解清楚 链表要会写,会分析.各种链表. 2.栈 LIFO(last in fi ...

  8. java 算法_Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

  9. 汇智动力学院——Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

最新文章

  1. 鸟哥的私房菜 第0章
  2. Broadcom BCM4322(如:HP 6530b)wifi不能用解决办法
  3. 【算法基础】漫画:什么是 “跳表” ?
  4. 关于sharepoint 里面的时间和Moss对象模型取出来的时间不一致问题
  5. css font简写
  6. Underscore.js 的模板功能
  7. 前端学习(2346):使用脚手架工具
  8. centos6.5安装python3.6
  9. 使用jQuery和Pure.CSS创建一个可编辑的表格
  10. Java实现数据批量导入数据库(优化速度-2种方法)
  11. extjs4动态生成多表头
  12. dll注入的一种方式
  13. flex自定义更新UI
  14. Java读取数据库中的数据
  15. Sumatra PDF
  16. 苹果手机怎么备份所有数据_数据蛙:微信怎么备份手机通讯录,随时备份和恢复手机联系人!...
  17. 科学道德与学风-2021雨课堂答案-第9章
  18. 大S首度曝光女儿正面照:小小幸福分享给大家
  19. anaconda中的python3环境与ros公用时的问题
  20. 破解SQLYog30天试用方法

热门文章

  1. android jni java call c字符串乱码,JNI系列入门之C语言中文字符串乱码问题
  2. swagger -- 前后端分离的API接口
  3. 牛客国庆集训派对Day3: I. Metropolis(dijkstra)
  4. bzoj 1634: [Usaco2007 Jan]Protecting the Flowers 护花(贪心排序)
  5. [Python + PyQt5] 均匀平面波的入射、反射及透射的仿真实验
  6. python机器学习库keras——AutoEncoder自编码、特征压缩
  7. xilinx官方教程ug871利用HLS实现RealFFT
  8. 字符串函数rpartition与partition
  9. 回顾之前易忘记的知识
  10. 【性能优化】如何让APK瘦成一道闪电