题目

设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空,约定当tag为0时队空,当tag为1时队不空,这样就可以用front==rear作为队满的条件要求,设计队列的结构和相关基本运算算法(队列元素是int型)。

分析

结构体定义:

/* 顺序队类型定义 */
typedef struct {int data[maxSize];int front;// 队首指针int rear;// 队尾指针int tag;// 表示队列是空还是不空,约定tag=0时队空,tag=1时队不空
} SqQueue;

要素:

  • qu.tag=0;qu.front=qu.rear=0;// 初始时
  • qu.front==qu.rear&&qu.tag==0;// 队空条件
  • qu.front==qu.rear&&qu.tag==1;// 队满条件

对于tag值的设置,初始时一定为0,插入成功后应设置为1,删除成功后应设置为0.因为只有在插入操作后,队列才有可能满,在删除操作后,队列才有可能空。tag 的值再配合上front==rear这一句的判断就能正确区分队满与队空。

代码

核心代码:

/* 初始化队列 */
void initQueue(SqQueue &qu) {qu.front=0;// 队首和队尾指针重合并指向0qu.rear=0;qu.tag=0;// 标志位表示队空
}/* 判断队空 */
int isQueueEmpty(SqQueue qu) {if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示队空return 1;// 1表示判断结果为空} else {return 0;// 0表示判断结果为非空}
}/* 判断队满 */
int isQueueFull(SqQueue qu) {if(qu.tag==1&&qu.front==qu.rear) { // 由于有标志位tag,故可以用此等式判断是否队满return 1;} else {return 0;}
}/* 入队 */
int enQueue(SqQueue &qu,int x) {if(isQueueFull(qu)==1) {return 0;} else {qu.rear=(qu.rear+1)%maxSize;// 若队未满,则移动指针qu.data[qu.rear]=x;// 再存入元素qu.tag=1;// 只要进队就将tag设置为1,因为只有进队才可能会发生队满return 1;}
}/* 出队 */
int deQueue(SqQueue &qu,int &x) {if(isQueueEmpty(qu)==1) { // 若队空,则不能出队return 0;} else {qu.front=(qu.front+1)%maxSize;// 若队不空,则移动指针x=qu.data[qu.front];// 再取出元素qu.tag=0;// 只要有元素出队,就把tag置为0,因为只有出队才可能队空return 1;}
}

完整代码:

#include<stdio.h>#define maxSize 20/* 顺序队类型定义 */
typedef struct {int data[maxSize];int front;// 队首指针int rear;// 队尾指针int tag;// 表示队列是空还是不空,约定tag=0时队空,tag=1时队不空
} SqQueue;/* 初始化队列 */
void initQueue(SqQueue &qu) {qu.front=0;// 队首和队尾指针重合并指向0qu.rear=0;qu.tag=0;// 标志位表示队空
}/* 判断队空 */
int isQueueEmpty(SqQueue qu) {if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示队空return 1;// 1表示判断结果为空} else {return 0;// 0表示判断结果为非空}
}/* 判断队满 */
int isQueueFull(SqQueue qu) {if(qu.tag==1&&qu.front==qu.rear) { // 由于有标志位tag,故可以用此等式判断是否队满return 1;} else {return 0;}
}/* 入队 */
int enQueue(SqQueue &qu,int x) {if(isQueueFull(qu)==1) {return 0;} else {qu.rear=(qu.rear+1)%maxSize;// 若队未满,则移动指针qu.data[qu.rear]=x;// 再存入元素qu.tag=1;// 只要进队就将tag设置为1,因为只有进队才可能会发生队满return 1;}
}/* 出队 */
int deQueue(SqQueue &qu,int &x) {if(isQueueEmpty(qu)==1) { // 若队空,则不能出队return 0;} else {qu.front=(qu.front+1)%maxSize;// 若队不空,则移动指针x=qu.data[qu.front];// 再取出元素qu.tag=0;// 只要有元素出队,就把tag置为0,因为只有出队才可能队空return 1;}
}/* 打印队列 */
void printQueue(SqQueue qu) {printf("\n");while(qu.rear!=qu.front) {qu.front=(qu.front+1)%maxSize;printf("%d\t",qu.data[qu.front]);}printf("\n");
}int main() {SqQueue qu;int nums[]= {1,2,3,4,5,6};int n=6;initQueue(qu);for(int i=0; i<n; i++) {int m=enQueue(qu,nums[i]);// 将数组中的元素入队}printQueue(qu);// 打印队列int x;deQueue(qu,x);// 将元素1出队printQueue(qu);// 打印队列return 0;
}

运行结果:

考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)相关推荐

  1. 【2011年全国试题3】已知循环队列存储在一维数组A[0…n-1],且队列非空时,front和rear分别指向队头元素和队尾元素。若初始时队列为空,且

    [2011年全国试题3]已知循环队列存储在一维数组A[0-n-1],且队列非空时,front和rear分别指向队头元素和队尾元素.若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时 ...

  2. (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表

    文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...

  3. 考研数据结构填空题整合_做题版

    考研数据结构填空题整合 目录 考研数据结构填空题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...

  4. 王道考研数据结构代码总结(前四章)

    目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...

  5. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  6. 考研数据结构之循环队列

    提示:居上位而不骄,在下位而不忧.故乾坤因其时而惕,虽危无咎矣 文章目录 前言 一.循环队列 1.1定义 1.2 基本操作 1.3 判断条件 1.3.1 队空 1.3.2 队满 1.牺牲一个单元用来区 ...

  7. 考研数据结构代码整理

    文章目录 1. 线性表的结构体定义 1.1)顺序表的结构体定义 1.2)考试中顺序表定义简写法 1.3)单链表的结构体定义 1.4)双链表结构体定义 2. 顺序表的基本操作 2.1)初始化顺序表 2. ...

  8. 考研数据结构名词解释

    第一章绪论 1.数据: 是描述客观事物得符号,是信息的载体,它是能够被计算机识别.存储和加工处理的对象.是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中被计算机程序处理的符号的总称,是计 ...

  9. 考研数据结构名词解释大全

    名词解释 1. **数据结构 ** 数据结构是相互之间存在一种或多种特定关系的数据元素的集合,数据结构包括三方面的内容:逻辑结构.存储结构.数据的运算 2. **逻辑结构 ** 数据元素之间的逻辑关系 ...

最新文章

  1. 应用热启动(Ctrl+Alt+Delete)在显示频中进行监控的应用
  2. 第十章 使用机器学习的建议-机器学习老师板书-斯坦福吴恩达教授
  3. 考研英语一2011年真题模考总结
  4. java多线程间的通信传值_Java 多线程之间的通信
  5. 移动端h5 顶部菜单栏_HTML5 移动端上 动态固定菜单栏的问题
  6. face++算法工程实习生面试
  7. XCode插件因为升级不能用了怎么办?几个步骤教你搞定
  8. KMP算法 学习笔记
  9. Ubuntu 13.10 安装后配置
  10. 笔记本的无线网卡驱动服务器,无线网卡驱动,详细教您怎么笔记本无线网卡驱动...
  11. SEO关键词策略——新站如何抗衡老站…
  12. 函数的支集、支撑集、support、supp
  13. Zabbix-agent部署
  14. 计算机电源图标关闭了怎么办,Win10电源图标不显示三种解决方法
  15. 常用集成电路功能简介 AD
  16. 【大数据开发】FlinkSQL实战
  17. 合并后的以太坊会像一个流域
  18. 心理测评系统选购指南
  19. 201671010402-陈靖 实验十四 团队项目评审课程学习总结
  20. ASR项目实战-语音识别

热门文章

  1. elixir 读取 marc条目 目次区字段信
  2. 目前最值得收藏的100个各类资源站
  3. 光线投射与光线跟踪算法归纳
  4. 程序员如何打造薪资15k
  5. 冷知识点:COLLATE 关键字是什么意思?
  6. IDEA的下载安装使用教程(含PJ)
  7. 深度学习笔记(3)——pytorch+TextCNN实现情感分类(外卖数据集)
  8. Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  9. php过滤特殊表情符号(亲测可用)
  10. 2022-05-25 网工进阶(七)OSPF-影响邻居关系建立的因素、路由撤销、路由汇总、路由过滤、Silent-Interface、报文认证