循环队列是为了充分利用内存,进行数据操作的一种基本算法。具体实现方式可划分为:链式队列和静态队列,这里所谓的静态是指在一片连续的内存区域进行数据操作。本文只讲述静态队列,也是最简单的实现方式,链式队列以及链表的实现内容请参见我的其它博文。以下静态循环队列简称为循环队列。
  
一、循环队列的特点及要素
<1> 先进先出(FIFO);
<2> 首尾元素 front 和 rear 的数值;
<3> 队列操作: 队列初始化、销毁队列、遍历队列、队列满、队列空、入队列,出队列。
<4> 队列满判断的两种方式:因为需要区分与队列空时 front 与 rear 的位置关系。
方式一:front == rear 并且 flag_full = true;
方式二:front= (rear + 1) % size;

二、具体实现及输出结果见下面程序,因为较为简单,不作注解了。有疑问可以 send comments to me。

#include <stdio.h>
#include <stdlib.h>typedef struct queue{char *buf;int front;int rear;int size;
} Queue, *pQueue;void Init_Queue(Queue *q, int maxsize)
{q->buf = (char *)malloc(sizeof(char) * maxsize);if (q->buf == NULL) {perror("malloc error: ");exit(1);}q->front = 0;q->rear = 0;q->size = maxsize;
}void Destroy_Queue(Queue *q)
{free(q->buf);
}void Traverse_Queue(Queue *q)
{int i = q->front;while (i % q->size != q->rear) {printf("buf[%d]: %d\n", i, q->buf[i]);i++;}
}bool Queue_Empty(Queue *q)
{return (q->front == q->rear);
}bool Queue_Full(Queue *q)
{return (q->front == ((q->rear + 1) % q->size));
}bool EnQueue(Queue *q, char val)
{if (!Queue_Full(q)) {*(q->buf + q->rear) = val;q->rear = (q->rear + 1) % q->size;return true;}printf("Queue Full!\n");return false;
}bool DeQueue(Queue *q, char *val)
{if(!Queue_Empty(q)) {*val = *(q->buf + q->front);q->front = (q->front + 1) % q->size;return true;} printf("Queue Empty!\n");return false;
}void main()
{Queue q;char a;Init_Queue(&q, 6);printf("Input queue elements: \n");while(!Queue_Full(&q)) {scanf("%d", &a);EnQueue(&q, a);}printf("Traverse queue elements: \n");Traverse_Queue(&q);printf("Delete queue elements: \n");while(!Queue_Empty(&q)) {DeQueue(&q, &a);printf("%d\n", a);}Destroy_Queue(&q);
}

程序运行结果:


关于循环队列主题的系列文章,可移步至以下链接:
1. 《循环队列及C语言实现<一>》
2. 《循环队列及C语言实现<二>》
3. 《循环队列及C语言实现<三>》

循环队列及C语言实现一相关推荐

  1. 循环队列及C语言实现三

    在之前的博客中给出了设计循环队列的思路以及源码,这些可都是经过我长期大数据测试的验证哦.当然,现在的很多开源项目和一些封装好的类或接口也都有类似的队列实现方法,之所以我还在使用自己写的这一套方法,主要 ...

  2. 循环队列及C语言实现二

    在我的上一篇博文中已经讲到循环队列的特点作用以及C语言实现,当然实现和操作的方式比较简单,在实际项目应用中略显粗糙.因此,这一篇提供一个进阶篇的实现与操作接口.具体函数作用可以参见我的注释部分,使用的 ...

  3. 循环队列c语言的实现,循环队列的C语言实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  4. 数据结构(严蔚敏)之五——循环队列(c语言实现)

    在这里我先强调几点概念: 1.在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置. 2.在单队列中我们判断队列是否为空的条件是:Q.front==Q.rear;而在循环队列 ...

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

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

  6. leetcode 622——设计循环队列

    leetcode 622--设计循环队列(C语言提交) 题目链接:leetcode 622--设计循环队列 题目描述: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先 ...

  7. c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)

    #include #include typedef struct node { int *base; int front; int rear; }Node; /* 思路: *使用一个顺序循环队列来存放 ...

  8. c语言数组方式实现静态循环队列

    1 循环队列原理图 2 结构体设计 3 运行结果图 4 完整源代码 #include<stdio.h> #include<malloc.h> /*这是一个c语言用数组方式实现循 ...

  9. 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

    队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...

最新文章

  1. JSP的执行过程(详解)
  2. react入门代码_如何在React中构建温度控制应用程序-包括提示和入门代码
  3. Asp.net中的两种刷新父窗体方法
  4. php7和7.1,PHP7.0和7.1 部分新增特性备忘代码分享
  5. maven <skip></skip>属性
  6. 程序员幽默:年后上班综合症,你中了几招?!!
  7. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
  8. vim 寄存器中的 ^@,^M,^J
  9. 佳能MP258的5200错误和P08代码解决方法及清零方法
  10. 牛客21781 牛兄牛弟
  11. [摘]IIS上部署WCF的问题
  12. NASA: Seeing Jupiter(注视木星)
  13. 2.4 sklearn中的metrics.roc_auc_score评价指标
  14. html5都能干嘛种花,把这19种花种起来,整个家都能变成大花园!
  15. Jlink之J-Scope虚拟示波器
  16. linux程序cat本地文本文件,linux – 这里有cat的文件
  17. 尼康d3200与智能设备 (android) 连接,,尼康D3200有WIFI功能吗
  18. CMake windows下代理设置
  19. Photoshop制作WiFi图标
  20. markdown_typora排版编辑技巧(样式嵌套/撤销/列表缩进)/表格内换行

热门文章

  1. 软件工程方法学要素含义_日期时间数据的要素工程
  2. 在Java 里面怎么比较字符串
  3. leetcode374. 猜数字大小(二分法)
  4. 节点对象转节点_节点流程对象说明
  5. 如何使用React Native构建嵌套的抽屉菜单
  6. 我们如何使用CircleCI 2.0来构建Angular应用并将其部署到AWS S3
  7. 实施工程师1分钟即时演讲_我是如何在1年内从时装模特转变为软件工程师的
  8. 飞机上的氧气面罩有什么用_第2部分—另一个面罩检测器……(
  9. 静态变数和非静态变数_统计资料:了解变数
  10. Spring.net的一个小例子