【问题描述】

实现循环队列的基本操作。(循环队列最大长度不超过20)

【输入形式】

输入若干个整数(以空格分隔,非整数结束输入),其中0表示做出队操作,不为0的整数为入队元素。

【输出形式】

若出队错误输出“error”;

若最后队列为空,则输出“empty”;

若最后队列非空,依次输出队列的全部元素。

【样例输入1】

1 0 2 0 0 3 0 0 0 a

【样例输出1】

error

【样例输入2】

1 0 2 0 3 0 a

【样例输出2】

empty

【样例输入3】

1 2 3 0 0 4 0 5 a

【样例输出3】

4 5

队列和栈一样也是一种操作受限的线性表。只能在表的两端分别进行插入和删除操作(只能在表尾插入,在表头删除)。并且队列的特点是“先进先出”。

队列的类型定义:假设线性表 Q=(a1,a2,····,ai,···,an)是一个队列,则a1为队头元素,an为队尾元素。如图所示:

顺序队列的表示和实现:

因为只在队头和队尾操作,所以需要设置两个指针 front 和 rear 分别指向队头和队尾位置,并可约定队尾指针 rear 指向当前队尾元素后的下一个位置,队头指针 front 指向当前队头元素。

顺序队列的表示形式如下:

插入和删除操作如图所示:

因为我们的重点是循环队列,所以顺序队列就不详细介绍了。

将一维数组的最后一个单元和第一个单一连接起来构成循环数组,此时称为“循环队列”,也有效的解决了“假溢出”的问题。

当尾指针已经指向数组的最后时,在进行入队操作过程中,可将队尾指针 rear 移至数组的起始位置,表示下一次入队操作的队尾。尾指针的移动方式是 rear=(rear+1)%MAXSIZE,队头指针移动也一样 front=(front+1)%MAXSIZE,如图所示:

循环队列初始化为空队时,front=rear=0;

队空:front==rear;

队满:(rear+1)%MAXSIZE==front,实际循环队列队满时所容纳的元素个数为MAXSIZE-1;通过空留一个存储单元的方式区分队满和队空的情况。

循环队列的顺序存储表示如下:

#define MAXSIZE 100    /*不用可变长因为队列一般不会太长*/
typedef struct
{QElemType *base;   //指向循环队列的存储空间int front;   //队头指针int rear;    //队尾指针
}SqQueue;

队列的初始化:

int InitQueue(SqQueue *Q)
{Q->base=(QElemType *)malloc(MAXSIZE*sizeof(QElemType));if(!Q->base) return ERROR;     //申请存储空间失败Q->front=Q->rear=0;     //设置队头队尾指针return OK;
}

入队操作:

需要判断循环队列是否已满。当队列不满,新元素入队,修改队尾指针指向下一个存储单元。

int EnQueue(SqQueue *Q,QElemType e)
{if((Q->rear+1)%MAXSIZE==Q->front)  //判断对是否已满return ERROR;Q->base[Q->rear]=e;     //元素e入队Q->rear=(Q->rear+1)%MAXSIZE;  //修改队尾指针return OK;
}

出队操作:

出队操作需要判断循环队列是否为空。不为空时,队头元素出队,修改队头指针指向下一个元素。

int DeQueue(SqQueue *Q,QElemType *e)
{if(Q->front==Q->rear) return ERROR;   //判断队空*e=Q->base[Q->front];     //*e返回队头元素值Q->front=(Q->front+1)%MAXSIZE;   //修改队头指针return OK;
}

下面查看代码的实现:

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 20     /*不用可变长因为队列一般不会太长*/
typedef  int QElemType; /*队列元素类型*/
typedef struct
{QElemType *base;   //指向循环队列的存储空间int front;   //队头指针int rear;    //队尾指针
}SqQueue;/*初始化队列*/
int InitQueue(SqQueue *Q)
{Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));if(!Q->base) return ERROR;     //申请存储空间失败Q->front=Q->rear=0;     //设置队头队尾指针return OK;
}/*求队长*/
int QueueLength(SqQueue *Q)
{return(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;}/*QueueLentgh*//*入队*/
int EnQueue(SqQueue *Q,QElemType e)
{if((Q->rear+1)%MAXQSIZE==Q->front)  //判断对是否已满return ERROR;Q->base[Q->rear]=e;     //元素e入队Q->rear=(Q->rear+1)%MAXQSIZE;  //修改队尾指针return OK;
}/*出队*/
int DeQueue(SqQueue *Q,QElemType *e)
{if(Q->front==Q->rear) return ERROR;   //判断队空*e=Q->base[Q->front];     //*e返回队头元素值Q->front=(Q->front+1)%MAXQSIZE;   //修改队头指针return OK;
}/*判队空*/
int QueueEmpty(SqQueue *Q)
{if(Q->front==Q->rear)return OK;else return ERROR;
}/*QueueEmpty*//*取队头*/
int GetHead(SqQueue *Q,QElemType *e)
{if(Q->front==Q->rear)return ERROR;*e=Q->base[Q->front];return OK;
}/*GetHead*//*销毁队列*/
int DestroyQueue(SqQueue *Q)
{if(Q->base){Q->rear=Q->front=0;free(Q->base);}return OK;
}/*DestroyQueue*/int main()
{SqQueue q;int e;InitQueue(&q);
/*使用队列基本操作完成程序功能*/InitQueue(&q);QueueLength(&q);while(scanf("%d",&e)==1){if(e==0){if(!DeQueue(&q,&e)){printf("error\n");return 0;}}else EnQueue(&q,e);}if(QueueEmpty(&q))printf("empty\n");else{while(!QueueEmpty(&q)){DeQueue(&q,&e);printf("%d ",e);}printf("\n");}return 0;
}

运行结果如下:

顺序循环队列的基本操作相关推荐

  1. 数据结构之顺序循环队列

    顺序循环队列 思维导图: 队列的定义: 队列的特点 队列的基本操作: 顺序循环队列基本操作的实现: 情况一:rear和front指向同一位置时 队列定义: 队列初始化: 入队: 出队: 队列判空: 返 ...

  2. 小孩报数(顺序循环队列版) (10 分)

    有若干个小孩围成一圈,现从指定的第1个开始报数,报到第 w个时,该小孩出列,然后从下一个小孩开始报数,仍是报到w个出列,如此重复下去,直到所有的小孩都出列(总人数不足w个时将循环报数),求小孩出列的顺 ...

  3. 环形队列的输出_循环队列的基本操作详细讲解

    实验学时: 2 实验类型: (设计型) 一.实验目的 1. 理解并掌握队列的逻辑结构和顺序存储结构,了解循环队列的特点: 2. 掌握循环队列中基本操作的相关算法: 3. 编程实现相关算法: 4. 学会 ...

  4. C语言循环队列的基本操作(init,enquene,dequene)与杨辉三角(C和C++<queue>)

    C语言循环队列的基本操作与杨辉三角(C和C++的表示方法) C语言的表示方法 #include <stdio.h> #include <malloc.h> #define ma ...

  5. 附加判定标志的循环队列的基本操作

    附加判定标志的循环队列的基本操作 描述 假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag== 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时, ...

  6. 循环队列的基本操作(实验)

    循环队列的基本操作(简略版) 前言 一.代码实现 二.运行结果 总结 前言 编程实现循环队列的以下基本操作:建队列,取队头元素,入队,出队.

  7. 【数据结构】顺序循环队列及其实现(C语言)

    给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置.为了有效地利用空间,引 ...

  8. 顺序循环队列类c#语言,C#--循环队列的顺序存储

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  9. java 实现循环队列等基本操作

    Node类: package SqQueue;public class Node {String name;int age;public Node() {}public Node(String nam ...

最新文章

  1. 清华大学:2021元宇宙研究报告!
  2. Python Redis pipeline操作(秒杀实现)
  3. python教授_Python为何如此优秀?斯坦福教授告诉你!
  4. minio 并发数_开源数据存储项目Minio:提供非结构化数据储存服务
  5. 质量超高的UI素材站!推荐UI\UX设计师
  6. hibernate+spring 注解 对事务的一些信息 (还没有整理)
  7. gateway配置mysql_使用Gateway配置路由以及动态路由
  8. 开发一个简单实用的android紧急求助软件
  9. Julia: Dates =DateFormat, format,parse.......
  10. Mybatis批量保存Clob类型时ORA-01461: can bind a LONG value only for insert into a LONG column报错解决方法
  11. 切图具体需要切什么内容_如何进行网页切图?网站建设切图的标准是什么?
  12. 算法时间复杂度分析(一)
  13. 数据结构 严薇敏 单链表(无头结点)的实现(增 删 改 查)及其使用方法详解
  14. 数据分析在网络营销中的意义有哪些
  15. 开机动画desc.txt描述文件的分析
  16. Android Studio 实现播放本地/网络视频
  17. 基于MT策略的实战分析
  18. 百度大脑 EasyEdge 推出端云协同服务,大幅提升本地部署模型迭代效率
  19. 贝勒大学计算机专业,贝勒大学(Baylor University)_贝勒大学申请条件_津桥留学【23年专注留学服务】...
  20. Diffusion Models专栏文章汇总:入门与实战

热门文章

  1. #内存不够,swap来凑# Linux上创建SWAP文件/分区
  2. WordPress疑难问题以及解决方案汇总
  3. struts2 - ation 访问 Servlet api
  4. Delphi编程过程中知识累积
  5. java类与对象(属性,方法)的使用
  6. python之cookbook-day03
  7. 【快速入门ORM框架之Dapper】大牛勿进系列
  8. XML万能数据库设计
  9. ASP.NET锚标记使用2种小方法
  10. Nhibernate+MVC开发日志