数据结构-王道2017-第3章 栈和队列-队列
1.队列简称队,也是一种操作受限的线性表,只允许在表的一端插入,而在表的另一端删除 先进先出FIFO,不能随便读取队列中间的某个数据
队头(Front):允许删除的一端,又称为队首
队尾(rear):允许插入的一端
空队列:不含任何元素的空表
基本操作: InitQueue(&Q),QueueEmpty(Q),EnQueue(&Q,x),DeQueue(&Q,&x),GetHead(Q,&x)
2.队列的顺序存储
设队头指针指向队头元素,队尾指针指向队尾元素的下一个位置(队头指针指向队头元素的钱一个位置,队尾指针指向队尾也可以)
typedef struct {ElemType data[MaxSize];int front, rear; }SqQueue;
队空条件:Q.front == Q.rear == 0;
但是队满条件不能是Q.rear==MaxSize,因为当front == Q.rear-1时,仍然妈祖条件,但此时队中只有一个元素,此时入队出现“上溢出”,但这种溢出并不是真正的溢出,这是顺序队列的缺点
3.循环队列
当队首指针Q.front=MaxSize-1后,再前进一个位置就自动到0,这可以利用除法取余运算(%)来实现
初始时:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize;
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize;
队列长度: (Q.rear+MaxSize - Q.front)%MaxSize; //加上MaxSize的原因是Q.rear可能循环到Q.front的左边,这时长度就是Q.rear+MaxSize - Q.front,%MaxSize的目的是Q.rear在Q.front的右边时,加上MaxSize就不是准确值了,所以取模,而取模对前一种情况是没有影响的
出队入队时:指针都按顺时针方向进1
且队空的条件为Q.front=Q.rear,而队满的条件也是Q.front=Q.rear(队尾指针追上了队首指针),解决方案:
1)牺牲一个单元来区分队空队满,入队时少用一个队列单元,这是一种较为普遍的做法,约定以“队头指针在队尾指针的下一个位置作为队满的标志”。
队满条件:(Q.rear+1)%MaxSize==Q.front
队空条件:Q.front==Q.rear
队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
2) 类型中增设表示元素个数的数据成员。这样队空的条件为Q.size == 0;队满的条件为Q.size==MaxSize,两种情况都有Q.front==Q.rear
3) 类型中增设tag数据成员,以区分堆满还是队空。tag等于0的情况下,若因删除导致Q.front==Q.rear则为队空,tag等于1的情况下,若因插入导致Q.front==Q.rear则为队满
3.循环队列的操作
//队列的顺序存储结构 const int MaxSize = 50;typedef int ElemType;typedef struct {ElemType data[MaxSize];int front, rear; }SqQueue;void InitQueue(SqQueue &q) {q.front = q.front = 0; }bool QueueEmpty(SqQueue q) {return q.rear == q.front; }bool EnQueue(SqQueue &q,ElemType x) {if ((q.rear + 1) % MaxSize == q.front)return false;q.data[q.rear] = x;q.rear = (q.rear + 1) % MaxSize;return true; }bool DeQueue(SqQueue &q, ElemType &x) {if (q.front == q.rear) //队列为空return false;x = q.data[q.front];q.front = (q.front + 1) % MaxSize;return true; }
4.队列的链式存储结构
typedef struct{ElemType data;LinkNode *next; }LinkNode; //注意不是指针 typedef struct {LinkNode *front, *rear; }LinkQueue;
队列的判空条件为:Q.front==NULL&&Q.rear==NULL,通常将链式队列设计成一个带头节点的单链表,这样插入和删除操作就统一了,不存在队满且产生溢出的问题
//队列的顺序存储结构 const int MaxSize = 50;typedef int ElemType;typedef struct{ElemType data;LinkNode *next; }LinkNode; //注意不是指针 typedef struct {LinkNode *front, *rear; }LinkQueue;void InitQueue(LinkQueue &q) {q.rear = q.front = (LinkNode*)malloc(sizeof(LinkNode));q.front->next = NULL; }bool QueueEmpty(LinkQueue q) {return q.rear == q.front; }void EnQueue(LinkQueue &q,ElemType x) {LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));p->data = x;p->next = NULL;q.rear->next = p;q.rear = p; }bool DeQueue(LinkQueue &q, ElemType &x) {if (q.rear == q.front)return false;LinkNode *p = q.front->next;x = p->data;q.front->next = p->next;if (p == q.front) //只有一个元素的时候要置尾指针为空q.rear = q.front; free(p);return true; }
5.双端队列
双端队列:指允许两段都可以进行入队和出队操作的队列,其元素的逻辑结构仍然是线性结构,两端分别称为前端和后端
输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列称为输出受限的双端队列
输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列
如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻接的栈了
6.试题精选
1)栈和队列都只能顺序存取
2)进队操作,只有尾指针变化,出队操作除了队中只有一个元素外(也会更改rear指针),只会更改front指针
转载于:https://www.cnblogs.com/--CYH--/p/6554442.html
数据结构-王道2017-第3章 栈和队列-队列相关推荐
- 【Java数据结构与算法】第一章 稀疏数组和队列
第一章 稀疏数组和队列 文章目录 第一章 稀疏数组和队列 一.线性结构和非线性结构 1.线性结构 2.非线性结构 二.稀疏数组 三.队列 1.队列 2.环形队列 一.线性结构和非线性结构 1.线性结构 ...
- (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)
前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...
- 王道考研408 数据结构 第三章 栈、队列与数组
第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...
- 王道408数据结构——第三章 栈和队列
一.栈 栈(Stack)是只允许在一端进行插入或删除操作的线性表. 栈顶:线性表允许插入删除的那一端 栈底:固定的.不允许进行插入删除的另一端 栈的操作特性可以概括为后进先出(LIFO) n个不同的元 ...
- 数据结构笔记(王道考研) 第一章:绪论
大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,该课属于付费课程(不过盗版网盘资源也不难找...).后续又根据23年考研的大纲对内容做了一些调整,将二叉排序树和平衡二叉树的内容挪到 ...
- 王道考研数据结构代码总结(前四章)
目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...
- Java数据结构与算法(第四章栈和队列)
2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...
- 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21
大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...
- 高一凡-数据结构第3章-栈与队列
高一凡-数据结构第3章-栈与队列 3.1栈 3.1.1栈的数据结构 3.1.2接口 3.1.3实现 VS2015实例代码包: 3.1栈 3.1.1栈的数据结构 struct SqStack {SEle ...
- 数据结构-第三章-栈和队列(5)-链队
数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...
最新文章
- 40行python开发一个区块链
- Hadoop安装及eclipse配置
- 记住:用户不是傻*,她是你的老婆大人
- 基于Tomcat5.0和Axis2开发Web Service应用实例
- uva 10539——Almost Prime Numbers
- ubuntu命令之dpkg
- c++自学笔记 7.15
- Python的lambda, filter, reduce 和 map简介
- Jquery—JQuery对select的操作(01)
- Python学习:[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 的解决方案
- 规范使用地图,从规范制图开始
- 常用通信光纤是如何分类的
- capslock键英语怎么读_capslock怎么读
- python编程入门到实践第二章_《Python编程:从入门到实践》第二章 变量和简单数据类型 习题答案...
- 【Google】“共码未来“—2022谷歌开发者大会参会记录
- 数据接口-免费版(股票数据API)
- 适合所有网站的前端优化技巧,值得你收藏!
- cad怎样编辑标注文字?分享一个方法
- 云端3d虚拟现实展制作
- 快速将网页内的公式粘贴到文档中
热门文章
- jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境
- android ui秘笈,看图说话 – Android UI 设计秘笈 :Part I
- C++ fscanf函数分割读取文本文件
- C++知识点54——RTTI(运行时类型识别)
- ViSP安装之Windows系统基于VS2019编译器编译获得VISP动态库
- android 时间戳转换成日期_Matlab将Unix时间戳转为可读日期
- [JDK8] Stream
- Python--day64--内容回顾
- 裸辞后,从Android转战Web前端的学习以及求职之路
- python面试题之“该死的for循环系列”(二)