文章目录

  • 队列的定义
  • 环形队列
  • 循环队列的基本操作
  • 链队
  • 链队的基本操作

队列的定义

队列(Queue):先进先出的线性表
队列是仅在队尾进行插入和队头进行删除操作的线性表

  • 队头(front):线性表的表头端,即可删除端
  • 队尾(rear):线性表的表尾端,即可插入端


由于这种队列存在假溢出现象,所以引入了循环链表解决假溢出想象

什么是假溢出可参考这篇文章

环形队列


区别环形队列是满队还是空队的两种方式

  • 另设一个标志以区别队列是满队还是空队
  • 少用一个元素空间
    队空的条件:Q.front == Q.rear
    队满的条件:(Q.rear+1)%MAXSIZE == Q.front

我们使用第二种方式实现

循环队列的基本操作

#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10
using namespace std;
typedef int Status;
typedef int QElemType;typedef struct {QElemType *base;//存储空间的基地址int front;//头指针int rear;//尾指针
}SqQueue;/*初始化队列1、为队列分配最大容量为MAXSIZE的数组空间,base指向数组空间的首地址2、头指针和尾指针置为0,表示队列为空
*/
Status InitQueue(SqQueue &Q){Q.base = new QElemType[MAXSIZE];if (!Q.base) exit(OVERFLOW);//存储空间分配失败Q.front = Q.rear = 0;//头尾指针置零return OK;
}
/*队列的长度(队列中元素的个数)*/
int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
/*循环队列入队1、判断队列是否已满,若满则返回ERROR2、将新元素插入到队尾3、队尾指针加1
*/
Status EnQueue(SqQueue &Q,QElemType e){if ((Q.rear+1)%MAXSIZE == Q.front) //(循环)队列满了return ERROR;Q.base[Q.rear] = e;//在队尾插入元素Q.rear = (Q.rear+1)%MAXSIZE;//队尾指针加1return OK;
}
/*循环队列出队1、判断队列是否为空,若空则返回ERROR2、保存队头元素3、队头指针加1
*/
Status DeQueue(SqQueue &Q,QElemType &e){if (Q.front == Q.rear)//对空return ERROR;e = Q.base[Q.front];Q.front = (Q.front+1)%MAXSIZE;//对头指针加1return OK;
}
/*取循环队列的队头元素*/
QElemType GetHead(SqQueue Q){if (Q.front != Q.rear)return Q.base[Q.front];
}int main(){SqQueue Q;InitQueue(Q);//初始化循环队列EnQueue(Q,1);//循环队列入队EnQueue(Q,2);EnQueue(Q,3);int length = QueueLength(Q);cout<<length<<endl;cout<<GetHead(Q)<<endl;int a,b,c;DeQueue(Q,a);//循环队列出队DeQueue(Q,b);DeQueue(Q,c);cout<<a<<b<<c<<endl;return 0;
}

链队

链队是指采用链式存储结构实现的队列。通常链队用单链表表示,一个链队显然需要两个分别指向队头和队尾的指针才能唯一确定

链队的基本操作

#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10;
using namespace std;
typedef int Status;
typedef int QElemType;typedef struct QNode{QElemType data;struct QNode *next;
}QNode,*QueuePtr;typedef struct{QueuePtr front;//头指针QueuePtr rear;//尾指针
}LinkQueue;/*链对的初始化1、生成新结点作为头结点,队头和队尾指针都指向此结点2、头节点的指针域置空
*/
Status InitQueue(LinkQueue &Q){Q.front = Q.rear = new QNode;Q.front->next = NULL;return OK;
}
/*链队入队1、为入队元素分配结点空间,用指针p指向2、将新结点的数据与置为e3、将新结点插入到队尾4、修改队尾指针指向p
*/
Status EnQueue(LinkQueue &Q,QElemType e){QueuePtr p = new QNode;p->data = e;p->next = NULL;Q.rear->next = p;//修改尾指针Q.rear = p;return OK;
}
/*链队出队1、判断队列是否为空,若空则返回ERROR2、临时保存队头的元素空间,已备释放3、修改队头指针指向下一个结点4、判断出队元素是否为最后一个元素,若是则将队尾指针指向头结点5、释放原队头元素的空间
*/
Status DeQueue(LinkQueue &Q,QElemType &e){if (Q.rear == Q.front) //链队为空return ERROR;QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;//修好头指针if (Q.rear == p) //删除最后一个元素Q.rear = Q.front;delete p;return OK;
}
/*取链队的队头元素*/
QElemType GetHead(LinkQueue Q){if (Q.front != Q.rear)return Q.front->next->data;
}int main(){LinkQueue Q;InitQueue(Q);EnQueue(Q,3);EnQueue(Q,2);EnQueue(Q,1);int a,b,c;DeQueue(Q,a);DeQueue(Q,b);DeQueue(Q,c);cout<<a<<b<<c<<endl;return 0;
}

队列——数据结构严蔚敏C语言版相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  2. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  3. 4.树和二叉树——数据结构 (严蔚敏C语言版)

    4.树 4.1树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n=0);或为非空树,对于非空树T: (1)有且仅有一个称之为根的结点; (2)除根结点以外的其余结点可分为m (m&g ...

  4. 数据结构(严蔚敏C语言版)代码实现持续更新中

    文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...

  5. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <stdlib.h> #define elemTyp ...

  6. 8.排序——数据结构(严蔚敏C语言版)

    8.排序 8.1概念 1.什么是排序? 排序:将一组杂乱无章的数据按一定规律顺次排列起来.即,将无序序列排成一个有序序列(由小到大或由大到小)的运算.如果参加排序的数据结点包含多个数据域,那么排序往往 ...

  7. 7.查找——数据结构(严蔚敏 C语言版)

    7.查找 7.1概念 7.1.1查找的分类 查找表可分为两类: 静态查找表: 仅作"查询"(检索) 操作的查找表. 动态查找表: 作"插入"和"删除& ...

  8. 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第3章  栈和队列 - 汉诺塔(Hanoi Tower)问题 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  9. 3-8-循环队列-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第3章  栈和队列 - 循环队列 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  10. 栈和队列-第3章-《数据结构题集》习题解析-严蔚敏吴伟民版

    习题集解析部分 第3章 栈和队列 --<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解 ...

最新文章

  1. C# 开发和使用中的33个技巧
  2. How program works
  3. 表的基本查询(数据库篇)
  4. 关于「Xception」和「DeepLab V3+」的那些事
  5. [JavaWeb-HTML]HTML标签_链接标签
  6. java连接mysql2008_在Java中如何使用jdbc连接Sql2008数据库(转)
  7. 在vs中使用python
  8. [BZOJ2282]消防
  9. Python打包成exe,pyc
  10. 我的Python之路:浏览器模拟
  11. Google I/O 2015开发者观赏指南
  12. Unity 基础数据库操作( Myspl 和 PostgreSQL)
  13. Ventrilo初学者指南,面向游戏玩家的VoIP应用
  14. 关于iPhone尺寸与分辨率
  15. 产品回顾本讲谈社汉字学习词典(kald)对于卡西欧EX-字的DataPlus系列
  16. Hduoj1011【树状DP】
  17. 转载天大一位学长的帖子
  18. 19 | Linux 常用命令全拼
  19. storm风暴英雄 tempo_Tempo Storm的风暴英雄观赛指南和结果预测
  20. Jquery基础学习之-入门

热门文章

  1. 感恩节(Thanksgiving Day)
  2. 从新一期技术雷达看技术领域最新趋势
  3. 波司登 × 阿里云 × 奇点云:教科书式的数智化转型实践
  4. 计算机ltm,LTM 文件扩展名: 它是什么以及如何打开它?
  5. Period、Duration计算时间间隔
  6. 规格型号、购方名称、地址备注等格式有误、特殊字符-无法开票?
  7. SQL中常用的字符串LEFT函数和RIGHT函数详解
  8. 01 - Python 调用outlook发送邮件
  9. 使用spark-submit工具提交Spark作业
  10. Java基础(二)标识符、变量、数据类型、运算符