14-循环队列实现(C语言)
循环队列实现
- 1.思路
- 1.1循环队列入队伪算法
- 1.2 循环队列出队伪算法
- 1.3 如何判断循环队列是否为空
- 1.4 如何判断循环队列是否为满
- 2.头文件
- 3.源文件
- 4.测试文件
- 5.测试结果
1.思路
1.1循环队列入队伪算法
(1)把值存在rear所在的位置;(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;
1.2 循环队列出队伪算法
(1)先保存出队的值;(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;
1.3 如何判断循环队列是否为空
if(front==rear)
队列空;
else队列不空;
1.4 如何判断循环队列是否为满
少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;
2.头文件
#ifndef __CIRCULARQUE_H__
#define __CIRCULARQUE_H__
#include <stdbool.h>#define MAXSIZE (5) //最大队列容量长度+1typedef int ElemType;typedef struct queue
{ElemType *pBase;ElemType front; //指向队列第一个元素ElemType rear; //指向队列最后一个元素的下一个元素ElemType maxsize; //循环队列的最大存储空间
} QUEUE, *PQUEUE;void InitQueue(PQUEUE Q, ElemType maxsize);
void TraverseQueue(PQUEUE Q);
bool FullQueue(PQUEUE Q);
bool EmptyQueue(PQUEUE Q);
bool PushQueue(PQUEUE Q, ElemType val);
bool PopQueue(PQUEUE Q, ElemType *val);
ElemType QueueLength(PQUEUE Q);
ElemType QueueFreeLength(PQUEUE Q);#endif // !__CIRCULARQUE_H__
3.源文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "circularQue.h"/*** @brief Create a empty Queue object** @param Q* @param maxsize*/
void InitQueue(PQUEUE Q, ElemType maxsize)
{Q->pBase = (ElemType *)malloc(maxsize * sizeof(ElemType));if (!Q->pBase){printf("Memory allocation failure");exit(-1);}Q->front = 0; Q->rear = 0;Q->maxsize = maxsize;memset(Q->pBase, 0, Q->maxsize);}
/*** @brief 遍历队列元素* * @param Q */
void TraverseQueue(PQUEUE Q)
{ElemType i = Q->front;printf("队中的元素是:\n");while (i % Q->maxsize != Q->rear){printf("%d ", Q->pBase[i]);i ++;}printf("\n");
}/*** @brief 判断队列满* * @param Q * @return true * @return false */
bool FullQueue(PQUEUE Q)
{if (Q->front == (Q->rear + 1) % Q->maxsize) //判断循环链表是否满,留一个预留空间不用{printf("Full Queue\r\n");return true;} elsereturn false;
}/*** @brief 判断队列为空* * @param Q * @return true * @return false */
bool EmptyQueue(PQUEUE Q)
{if (Q->front == Q->rear) //判断是否为空return true;elsereturn false;
}/*** @brief 插入元素val为Q的新的队尾元素* * @param Q * @param val * @return true * @return false */
bool Pushqueue(PQUEUE Q, ElemType val)
{if (FullQueue(Q)){return false;}else{Q->pBase[Q->rear] = val;Q->rear = (Q->rear + 1) % Q->maxsize;return true;}
}/*** @brief 若队列不空,则删除Q的队头元素,用val返回其值,并返回OK;否则返回ERROR * * @param Q * @param val * @return true * @return false */
bool PopQueue(PQUEUE Q, ElemType *val)
{if (EmptyQueue(Q)){return false;}else{*val = Q->pBase[Q->front];Q->front = (Q->front + 1) % Q->maxsize;return true;}
}
/*** @brief 销毁队列Q,Q不再存在* * @param Q */
void DestroyQueue(PQUEUE Q)
{ if (Q->pBase)free(Q->pBase);Q->pBase = NULL;Q->front = Q->rear = 0;Q->maxsize = 0;
}
/*** @brief 将Q清为空队列* * @param Q */
void ClearQueue(PQUEUE Q)
{ Q->front = Q->rear = 0;memset(Q->pBase, 0, Q->maxsize);
}
/*** @brief 返回Q中当前的元素个数,即队列的长度* * @param Q * @return ElemType */
ElemType QueueLength(PQUEUE Q)
{ //printf("Q->rear:%d, Q->front:%d\r\n",Q->rear,Q->front);return (Q->rear - Q->front + Q->maxsize) % Q->maxsize;
}
/*** @brief 返回Q中还剩余的空间长度* * @param Q * @return ElemType */
ElemType QueueFreeLength(PQUEUE Q)
{return (Q->maxsize -1) - QueueLength(Q); //会浪费一个空间
}
/*** @brief 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR* * @param Q * @param e * @return Status */
bool GetHead(PQUEUE Q,ElemType *e)
{ if (EmptyQueue(Q)){return false;}*e = Q->pBase[Q->front];printf("GetHead:%d\r\n",*e);return true;
}
4.测试文件
void test(void)
{ElemType headValue = 0;ElemType popValue = 0;ElemType queueLen = 0;ElemType freeQueueLen = 0;QUEUE *queue = ( QUEUE *)malloc(sizeof(QUEUE));InitQueue(queue,MAXSIZE);Pushqueue(queue,1);Pushqueue(queue,2);Pushqueue(queue,3);Pushqueue(queue,4);freeQueueLen = QueueFreeLength(queue);printf("freeQueueLen:%d\r\n",freeQueueLen);Pushqueue(queue,5);TraverseQueue(queue);queueLen = QueueLength(queue);printf("queueLen:%d\r\n",queueLen);GetHead(queue,&headValue);PopQueue(queue,&popValue);printf("popValue:%d\r\n",popValue);TraverseQueue(queue);queueLen = QueueLength(queue);printf("queueLen:%d\r\n",queueLen);
}int main(void)
{test();system("pause");return 0;
}
5.测试结果
14-循环队列实现(C语言)相关推荐
- 循环队列及C语言实现三
在之前的博客中给出了设计循环队列的思路以及源码,这些可都是经过我长期大数据测试的验证哦.当然,现在的很多开源项目和一些封装好的类或接口也都有类似的队列实现方法,之所以我还在使用自己写的这一套方法,主要 ...
- 循环队列及C语言实现二
在我的上一篇博文中已经讲到循环队列的特点作用以及C语言实现,当然实现和操作的方式比较简单,在实际项目应用中略显粗糙.因此,这一篇提供一个进阶篇的实现与操作接口.具体函数作用可以参见我的注释部分,使用的 ...
- 循环队列及C语言实现一
循环队列是为了充分利用内存,进行数据操作的一种基本算法.具体实现方式可划分为:链式队列和静态队列,这里所谓的静态是指在一片连续的内存区域进行数据操作.本文只讲述静态队列,也是最简单的实现方式,链式队列 ...
- 循环队列c语言的实现,循环队列的C语言实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...
- 数据结构(严蔚敏)之五——循环队列(c语言实现)
在这里我先强调几点概念: 1.在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置. 2.在单队列中我们判断队列是否为空的条件是:Q.front==Q.rear;而在循环队列 ...
- 顺序循环队列类c#语言,C#--循环队列的顺序存储
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- leetcode 622——设计循环队列
leetcode 622--设计循环队列(C语言提交) 题目链接:leetcode 622--设计循环队列 题目描述: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先 ...
- c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)
#include #include typedef struct node { int *base; int front; int rear; }Node; /* 思路: *使用一个顺序循环队列来存放 ...
- c语言数组方式实现静态循环队列
1 循环队列原理图 2 结构体设计 3 运行结果图 4 完整源代码 #include<stdio.h> #include<malloc.h> /*这是一个c语言用数组方式实现循 ...
- 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...
队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...
最新文章
- mysqlhelper
- appium ios 真机自动化环境搭建
- 【Flutter】Icons 组件 ( FlutterIcon 下载图标 | 自定义 svg 图标生成 ttf 字体文件 | 使用下载的 ttf 图标文件 )
- 剑指offer(1-10题)详解
- Leetcode-单调数列(896)
- java for loop_Java for循环执行了两次
- Mahout各种推荐器的主要特点(转)
- queue double java_一文弄懂java中的Queue家族
- 数字签名开源_开源如何推动数字艺术时代
- 解决服务器被黑上不了网的问题
- 要了解CommunityServer的架构不得不看的文章
- 谷歌翻译api_Deepl:一款优秀的专业翻译软件
- python 表格处理项目该如何分工_python 处理 Excel 表格
- Redhawk 如何gds2def?
- Matlab中sim函数的用法
- iTextSharp,将多张图片合并生成PDF文件
- Fragment XXXXXX{xxxxxxxxx} not attached to Activity
- ARM架构-arm基础
- NASA CEA 安装指南
- 我是如何通过拉勾教育学习《java高薪训练营》课程突破困境的