一、队列的基本概念

(1)定义:只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表。
(2)特点:先进先出

示意图如下:

二、顺序存储结构的队列

有6个存储空间的顺序队列动态示意图

2.1、顺序队列的“假溢出”问题

①假溢出
顺序队列因多次入队列和出队列操作后出现的虽有存储空间但不能进行入队列操作的情况。

②如何解决顺序队列的假溢出问题?
可采取四种方法:
1 )采用循环队列;
2 )按最大可能的进队操作次数设置顺序队列的最大元素个数;
3 )修改出队算法,使每次出队列后都把队列中剩余数据元素向队头方向移动一个位置;
4)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。

三、顺序循环队列的表示和实现

3.1、顺序循环队列的基本原理

 把顺序队列所使用的存储空间构造成一个逻辑上首尾相连的循环队列。当rear和front达到MaxQueueSize-1后,再前进一个位置就自动到0。

3.2、顺序循环队列的队空和队满判断问题

新问题:在循环队列中,空队特征是front=rear;队满时也会有front=rear;判决条件将出现二义性!
解决方案有三:
①使用一个计数器记录队列中元素个数(即队列长度);
  判队满:count>0 && rearfront; countMaxQueueSize
判队空:count0
②加设标志位,出队时置0,入队时置1,则可识别当前front=rear属于何种情况
判队满:tag1 && rearfront
判队空:tag0 && rearfront
③ 少用一个存储单元
  队满: front==(rear+1)%MaxQueueSize
判队空: rearfront

3.3、顺序循环队列的实现

//顺序循环队列的结构体定义如下:
typedef struct
{DataType queue[MaxQueueSize];int rear;  //队尾指针int front;  //队头指针int count;  //计数器
} SeqCQueue; //(1)初始化QueueInitiate(Q)
void QueueInitiate(SeqCQueue *Q)
{Q->rear = 0;       Q->front = 0;Q->count = 0;
}//(2)非空否QueueNotEmpty(Q)
//判断循环队列Q非空否,非空则返回1,否则返回0
int QueueNotEmpty(SeqCQueue Q)
{if(Q.count != 0)  return 1;else return 0;
}//(3)入队列QueueAppend(Q, x)
//把数据元素值x插入顺序循环队列Q的队尾,成功返回1,失败返回0
int QueueAppend(SeqCQueue *Q, DataType x)
{if(Q->count > 0 && Q->rear == Q->front){ printf("队列已满无法插入! \n");return 0;}else{    Q->queue[Q->rear] = x;Q->rear = (Q->rear + 1) % MaxQueueSize;Q->count++;return 1;}
}//(4)出队列  QueueDelete(Q, d)
//删除顺序循环队列Q的队头元素并赋值给d,成功则返回1,失败返回0
int QueueDelete(SeqCQueue *Q, DataType *d)
{if(Q->count == 0){    printf("队列已空无数据元素出队列! \n");return 0;}else{    *d = Q->queue[Q->front];Q->front = (Q->front + 1) % MaxQueueSize;Q->count--;return 1;}
}//(5)取队头数据元素 QueueGet(Q, d)
int QueueGet(SeqCQueue Q, DataType *d)
{if(Q.count == 0){printf("队列已空无数据元素可取! \n");return 0;}else{*d = Q.queue[Q.front];return 1;}
}

四、链式存储结构的队列

链式队列的存储结构
链式队列的队头指针指向队列的当前队头结点;队尾指针指在队列的当前队尾结点.

不带头结点的链式队列的结构如下:

//结点的结构体可定义如下:
typedef struct qnode
{DataType data;struct qnode *next;
} LQNode;   //队头指针front和队尾指针rear的结构体类型:
typedef struct
{LQNode *front; //队头指针                  LQNode *rear;   //队尾指针
} LQueue;//(1)初始化  QueueInitiate(Q)
void QueueInitiate(LQueue *Q)
{Q->rear = NULL;                    //队头指针Q->front = NULL;                  //队尾指针
}//(2)非空否QueueNotEmpty(Q)
int QueueNotEmpty(LQueue Q)
{if(Q.front == NULL) return 0;else return 1;
}//(3)入队列   QueueAppend(Q, x)
int QueueAppend(LQueue *Q, DataType x)
{LSNode *p;p = (LQNode *)malloc(sizeof(LQNode)) ; p->data = x;p->next = NULL;if(Q->rear != NULL) Q->rear->next = p;  //队列非空时,队尾增加新结点Q->rear = p;  //修改队尾指针if(Q->front == NULL) Q->front = p; //队列原来为空时修改队头指针if(Q->front==NULL){Q->rear= p; Q->front= p;}else {Q->rear->next = p;     Q->rear = p; }return 1;
}//(4)出队列 QueueDelete(Q, d)
int QueueDelete(LQueue *Q, DataType *d)
{LQNode *p;if(Q->front == NULL){   printf("队列已空无数据元素出队列! \n");   return 0;}else{ *d = Q->front->data;p = Q->front;Q->front = Q->front->next;//只有一个结点,删除之后队列为空,修改尾指针if(Q->front == NULL) Q->rear = NULL;              free(p);return 1;}
}//(5)取队头数据元素QueueGet(Q, d)
int QueueGet(LQueue Q, DataType *d)
{if(Q.front == NULL){ printf("队列已空无数据元素出队列! \n");return 0;}else{*d = Q.front->data;return 1;}
}

五、优先级队列:带有优先级的队列。

5.1、优先级队列和一般队列的主要区别

优先级队列的出队列操作不是把队头元素出队列,而是把队列中优先级最高的元素出队列。

struct DataType
{                    ElemType elem;     //数据元素  int priority;      //优先级
};/*出队列操作
(把优先级最高的元素出队列并由函数返回,优先级相同时按先进先出的原则出队列。取顺序优先队列中优先级最高的元素算法类同)*/
int QueueDelete(SeqPQueue *Q, DataType *d)
//删除优先级队列Q中优先级最高的元素
{DataType min;int minIndex, i;if(Q->size <= 0){printf("队列已空无数据元素出队列! \n");return 0;}   else{   min = Q->queue[0];minIndex = 0;for(i = 1; i < Q->size; i++){if(Q->queue[i].priority < min.priority){    min = Q->queue[i];minIndex = i;}}*d = Q->queue[minIndex];for(i = minIndex+1; i < Q->size; i++){Q->queue[i-1] = Q->queue[i];}Q->size--;     return 1;}
}//取优先级最高的元素
int QueueGet(SeqPQueue *Q, DataType *d)
{DataType min;int minIndex i;if(Q->size<=0){printf(“”)return 0;}else{min=Q->queue[0];minIndex =0;for(i=1;i<Q->size;i++)if(Q->queue[i].priority<min.priority){min=Q->queue[i];minIndex =i;}*d=Q->queue[minIndex];return 1;}
}

C语言数据结构——队列相关推荐

  1. 舞伴配对问题c语言实训报告,C语言数据结构队列实现舞伴匹配(数据结构第二次实验)...

    C语言实验作业 题目如下: 课程名称:数据结构 实验目的: 1.掌握队列的定义及实现: 2.掌握利用队列的基本操作. 实验要求: 1.    使用链式结构完成队列的各种基本操作: 2.    补充完善 ...

  2. GO语言-数据结构-队列

    目录 1.队列的顺序存储结构 1.1 队列顺序存储结构-结构体定义 1.2 队列顺序存储结构--初始化队列 1.3 队列顺序存储结构-入队 1.4 队列顺序存储结构-出队 1.5 完整代码 2.循环队 ...

  3. c语言数据结构之队列

    前言 不同于栈,队列是一个先进先出的数据结构,规定数据节点从队列尾插入,从队列头取出,禁止对头尾两端以外的数据进行操作.队列可以分为顺序队列和循环队列. C语言数据结构之单链表 C语言数据结构之双向链 ...

  4. c语言编程队列题,数据结构C语言编程 队列.doc

    数据结构C语言编程 队列 #include #include #define MAXQSIZE 10 typedef struct { int *base; //存储空间的起始地址,即数组的首地址,即 ...

  5. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  6. 数据结构——队列的C语言代码实现

    系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...

  7. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  8. C语言数据结构【手抄版】第五章 树和二叉树【上篇】

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 5.1.树的基本概念和术语 1.树的定义 2.树的表示法 3.基本术 ...

  9. C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历)

    C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历) tips:前些天学习了C语言数据结构链表,栈,队列.今天来学习一下C语言数据结构之二叉树的各种操作. 注意:二叉树的层次建树是 ...

  10. Go语言-数据结构与算法

    go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...

最新文章

  1. Linux那些事儿 之 戏说USB(32)驱动的生命线(四)
  2. php开发自学经典.pdf_PHP从入门到精通(第3版) PDF扫描版[45MB]
  3. 翻译:XtraDB/InnoDB中的AUTO_INCREMENT处理方式(已提交到MariaDB官方手册)
  4. 主键id 请求参数用什么类型_中小型项目用SpringBoot太大了,不如尝试下Martian
  5. FMS3系列(二):创建可交互的FMS连接--I can say:Hello World
  6. 钰群USB3.0音视频信号采集
  7. 小米靠着“便宜”在手机市场中占有一席之地
  8. 12月15日学习内容整理:ORM中的queryset类型,中介模型,extra函数和分组补充
  9. 设置MyEclipse编码、补全快捷键、字体大小
  10. 【大数据24小时】“天智一号”卫星将在太空计算数据;“电子身份证”亮相支付宝...
  11. 体彩大乐透模拟机选随机号码_模拟
  12. SAXReader解析器
  13. 【软件工具使用】Ubuntu下高效工作工具使用(持续更新)
  14. Java:实现使用蛮力方法解决旅行推销员问题算法(附完整源码)
  15. LabVIEW设计程序框图
  16. 树莓派python语音唤醒_唤醒DuerOS Python SDK(解决声音切回树莓派的问题)
  17. 51nod1423 最大二“货”
  18. 宁波大学计算机非全,宁波大学考研:全日制和非全日制的6大区别,很多人不知道...
  19. 智能音箱天猫精灵使用体验--写在前面的话
  20. UVA 11134 Fabled Rook 枚举 multiset加速

热门文章

  1. ios漂亮的启动动画
  2. 3.3计算机网络(ALOHA协议 CSMA协议 令牌传递协议 频分时分波分码分)
  3. 使用MeGUI的一些问题及个人解决方案,仅作个人备注使用。
  4. 被破解毁掉的国产游戏之光
  5. es7 如何从项目resource读取index的mapping、setting.json文件
  6. java面试时怎么做自我介绍_面试时如何做好自我介绍
  7. 关于外接显示器无信号的解决办法Win10
  8. Android复制assets文件到SD卡
  9. Dijkstra算法(迪杰斯特拉算法)
  10. Windows易升升级指南(解决大版本间更新95%的问题)