首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言实现循环队列

C语言实现循环队列

作者头像
忆想不到的晖
发布于 2020-07-15 04:02:51
发布于 2020-07-15 04:02:51
3.1K00
代码可运行
举报
文章被收录于专栏:huihui
运行总次数:0
代码可运行

文章目录
  • 顺序队列的假溢出
    • 解决上溢的方法
    • 引入循环队列
  • 循环队列判空、判满冲突
  • 循环队列常规操作
  • 定义循环队列结构体
  • 初始化循环队列
  • 循环队列判满
  • 循环队列判空
  • 计算循环队列的长度
  • 循环队列 入队(EnQueue)
  • 循环队列 出队(DeQueue)
  • 循环队列各操作测试
  • 源代码

顺序队列的假溢出

1️⃣:初始化空队列,q -> front = q -> rear = 0

2️⃣:入队a1、a2、a3,q -> front = 0, q -> rear = 3

3️⃣:出队a1、a2,q -> front = 2, q -> rear = 3

4️⃣:入队a4、a5、a6,q -> front = 2, q -> rear = 6

执行 4️⃣ 操作后队列的"尾指针"已经超出对队列的最大范围了,之后无法再进行入队操作,而队列实际空间并未占满,就造成了假溢出。

解决上溢的方法

1、将队中元素依次向队头方向移动。

  • 缺点:浪费时间。每移动一次, 队中元素都要移动

2、将队列空间设想成一个循环的表,即分配给队列的 m 个存储单元可以循环使用,当 rearMAXSIZE 时,若队列的开始端空着,又可从头使用空着的空间。当 frontMAXSIZE 时也是一样。

我们采用第2种方法

5️⃣:入队a7,q -> front = 2, q -> rear = 0

引入循环队列

base[0] 接在 base[MAXSIZE -1] 之后,若 rear + 1 == M,则令 rear = 0

实现方法: 利用 模(mod,C语言中: %)运算

插入元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 队尾入队
q -> base[q -> rear] = data;
// 更新队尾指针
q -> rear = (q -> rear + 1) % MAXSIZE;

删除元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 队头元素出队
data = q -> base[q -> front];
// 更新队头指针
q -> front = (q -> front + 1) % MAXSIZE;

循环队列判空、判满冲突

解决方案:

1.另外设一个标致以区别队空、队满

2.另设一个变量,记录元素个数

3.少用一个元素空间

本文实现的方法就是第三种。

循环队列常规操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/********************* 循环队列的常规操作 **************************/

Queue    InitQueue();             	// 初始化循环队列
int      QueueFull();               // 循环队列判满
int      QueueEmpty();              // 循环队列判空
int      QueueLength();             // 求循环队列长度(元素个数)
int      EnQueue();                 // 循环队列 入队
int      DeQueue();                 // 循环队列 出队

void     QueueStatus();             // 打印队满、队空、队长状态
/****************************************************************/

定义循环队列结构体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "stdio.h"
#include "malloc.h"

#define TRUE  1
#define FALSE 0
#define MAXSIZE 10

typedef int ElemType;


// 定义循环队列结构体
typedef struct Queue{

	int *base;	// 队列首地址
	int front;	// 队列头下标
	int rear;	// 队列尾下标

}*Queue;

初始化循环队列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 初始化循环队列 
*/
Queue InitQueue(){
    Queue q;
    // 分配循环队列空间
    q -> base = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
    q -> front = q -> rear = 0;
    return q;
}

循环队列判满

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  循环队列判满
 *  q 循环队列
*/
int QueueFull(Queue q){
    if(q == NULL){
        return FALSE;
    }
    return (q -> rear + 1) % MAXSIZE == q -> front;
}

循环队列判空

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  循环队列判空
 *  q 循环队列
*/
int QueueEmpty(Queue q){
    if(q == NULL){
        return FALSE;
    }
    return q -> front == q -> rear;
}

计算循环队列的长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  计算循环队列长度
 *  q 循环队列
*/
int QueueLength(Queue q){
    if(q == NULL){
        return FALSE;
    }
    return (q -> rear - q -> front + MAXSIZE) % MAXSIZE;
}

循环队列 入队(EnQueue)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  循环队列 入队
 *  q 循环队列
 *  data 入队元素
*/
int EnQueue(Queue q, ElemType data){
    if(QueueFull(q)){
        return FALSE;
    }
    // 队尾入队
    q -> base[q -> rear] = data;
    // 更新队尾指针
    q -> rear = (q -> rear + 1) % MAXSIZE;
    return TRUE;
}

循环队列 出队(DeQueue)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  循环队列 出队
 *  q 循环队列
 *  *val 用来存出队元素的数据 
*/
int DeQueue(Queue q, ElemType *val){
    if(QueueEmpty(q)){
        return FALSE;
    }
    // 队头元素出队
    *val = q -> base[q -> front];
    // 更新队头指针
    q -> front = (q -> front + 1) % MAXSIZE;
    return TRUE;
}

循环队列各操作测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 打印队满、队空、队长状态
 * q 循环队列
*/
void QueueStatus(Queue q){
    printf("QueueFull():%d\n", QueueFull(q));
    printf("QueueEmpty():%d\n", QueueEmpty(q));
    printf("QueueLength():%d\n\n", QueueLength(q));
}

// 程序主入口
int main(int argc, char const *argv[])
{   
    Queue q = InitQueue();
    printf("QueueMaxSize: %d\n\n", MAXSIZE);
    QueueStatus(q); // 打印队满、队空、队长状态

    // 入队
    printf("EnQueue():");
    for(int i = 1; i < MAXSIZE * 2; i+=2){
        printf("%d\t", i);
        EnQueue(q, i);
    }

    printf("\n");
    QueueStatus(q);

    // 出队
    int val;
    printf("DeQueue():");
    while(!QueueEmpty(q)){
        DeQueue(q, &val);
        printf("%d\t", val);
    }
    printf("\n");
    QueueStatus(q);

    // 测试循环队列是否会假溢出
    int num = 20;
    printf("EnQueue(%d): %d\t(0 Failed, 1 Success)\n", num, EnQueue(q, num));
    QueueStatus(q);
    return 0;
}

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QueueMaxSize: 10

QueueFull():0
QueueEmpty():1
QueueLength():0

EnQueue():1     3       5       7       9       11      13      15      17      19
QueueFull():1
QueueEmpty():0
QueueLength():9

DeQueue():1     3       5       7       9       11      13      15      17
QueueFull():0
QueueEmpty():1
QueueLength():0

EnQueue(20): 1(0 Failed, 1 Success)
QueueFull():0
QueueEmpty():0
QueueLength():1

源代码

源代码已上传到 GitHub Data-Structure-of-C,欢迎大家下载 C语言实现数据结构

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言实现顺序队列
顺序队列和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个 “指针” front 和 rear 分别指示队列头元素及队列尾元素的位置。
忆想不到的晖
2020/07/15
1.8K0
C语言实现顺序队列
数据结构:队列的顺序存储结构(循环队列)
本文介绍了循环队列的实现方式和应用场景,通过对比循环队列和传统队列的差异,阐述了循环队列的优势和劣势。同时,给出了一种基于填充计数的循环队列实现方法,并给出了相应的代码示例。
s1mba
2018/01/03
1.5K0
数据结构:队列的顺序存储结构(循环队列)
队列(常用数据结构之一)
那么a1为对头元素,an为队尾元素。最早进入队列的元素也会最早出来,只有当最先进入队列的元素都出来以后,后进入的元素才能退出。 在日常生活中,人们去银行办理业务需要排队,这就类似我们提到的队列。每一个新来办理业务的需要按照机器自动生成的编号等待办理,只有前面的人办理完毕,才能轮到排在后面的人办理业务。新来的人进入排队状态就相当于入队,前面办理完业务离开的就相当于出队。队列有两种存储表示:顺序存储和链式存储。采用顺序存储结构的队列被称为顺序队列,采用链式存储结构的队列称为链式队列。 基本运算 InitQueue() ——初始化队列 EnQueue() ——进队列 DeQueue() ——出队列 IsQueueEmpty() ——判断队列是否为空 IsQueueFull() ——判断队列是否已满 顺序队列 由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素。 队列为空时,队头指针front和队尾指针rear都指向下标为0的存储单元,当元素a,b,c,d,e,f,g依次进入队列后,元素a~g分别存放在数组下标为0~6的存储单元中,队头指针front指向元素a,队尾指针指rear向元素g的下一位置。如图所示。
后端码匠
2020/12/09
6570
队列(常用数据结构之一)
队列的基本概念详解,循环队列、链式队列的C++详细实现
队列的顺序存储形式,可以用一段连续的空间存储数据元素,用两个整型变量记录队头和队尾元素的下标。
莫浅子
2022/11/18
1.4K0
队列的基本概念详解,循环队列、链式队列的C++详细实现
【数据结构】详谈队列的顺序存储及C语言实现
大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。 队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算的定义,从这一篇开始,我们将详细介绍队列的数据的存储结构以及数据的运算的实现。 在今天的内容中,我们要介绍的是队列在内存中的顺序存储结构以及如何通过C语言来实现相关的基本操作。
蒙奇D索隆
2024/01/21
1.5K0
【数据结构】详谈队列的顺序存储及C语言实现
循环队列原理及在单片机串口通讯中的应用(一)
  当写代码,不再是简单的完成需求,对代码进行堆砌,而是开始思考如何写出优美代码的时候,我们的代码水平必然会不断提升,今天,咱们来学习环形队列结构。
用户8913398
2021/08/16
1.2K0
循环队列原理及在单片机串口通讯中的应用(一)
数据结构-栈和队列
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:
黄规速
2022/04/14
5870
数据结构-栈和队列
数据结构代码题-栈、队列
04.设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。
愷龍
2023/10/16
3490
数据结构代码题-栈、队列
队列的存储结构的实现(C/C++实现)
存档 1 #include "iostream.h" 2 #include "stdlib.h" 3 #define max 20 4 typedef char elemtype; 5 #include "queue.h" 6 void main() 7 { 8 elemtype e; 9 queue q; 10 cout<<"(1)初始化队列q"<<endl; 11 initqueue(q); 12 cout<<"(2)队列为"<<(queueem
Angel_Kitty
2018/04/09
6550
队列的存储结构的实现(C/C++实现)
浅谈栈与队列
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
一条晒干的咸鱼
2024/11/19
1140
浅谈栈与队列
数据结构C语言实验三之循环队列
算法设计题:对于循环队列,利用队列的基本运算,设计删除队列中从队头开始的第k个元素的算法。
菜菜有点菜
2023/11/23
2850
数据结构C语言实验三之循环队列
数据结构之循环队列
前言: 关于循环队列需明白以下几点: 1、循环队列是队列的顺序存储结构 2、循环队列用判断是否为空利用 Q.front=Q.rear 3、循环队列头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置 4、按照队列的定义,队头删除,队尾插入,在这里插入图片描述会导致队头之前可能有空余的内存空间(如下图J1,J2出队后,空间被浪费),为了解决该问题,提出循环队列的解决方案
全栈程序员站长
2022/09/05
3150
数据结构之循环队列
顺序循环队列
1 //循环队列的顺序存储表示与实现 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 /****************************************************************************** 7 /* 数据类型和常量定义 8 /*****************************************************************************
猿人谷
2018/01/17
8780
顺序循环队列
C语言队列(排队)先进先出.实现全部函数
#include <stdio.h> #include <stdlib.h> /************************************************************************/ /* 队列 结构要素:队列容量 内存指针 元素个数 队列头 对列尾 */ /************************************************************************/ #define QUEUE_CAPA
贵哥的编程之路
2022/05/13
7000
队列的基本操作
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 其实我们来对比栈,栈的特点是只能在一端进行操作的,而队列是一端插入一端删除。
兰舟千帆
2022/07/16
4660
队列的基本操作
循环队列出队-循环队列的c语言实现
  队列就是一个能够实现“先进先出”的存储结构,队列分为链式队列和静态队列。静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。说白了循环队列就是一个数组循环队列出队,我们把这个数组当成首尾相连来使用(写到数组的末尾后从头开始写)。
宜轩
2022/12/29
7950
数据结构:循环队列(C语言实现)[通俗易懂]
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题
全栈程序员站长
2022/09/05
6830
数据结构:循环队列(C语言实现)[通俗易懂]
数据结构-队列
本文介绍了循环队列和链队列的区别,以及它们的实现细节。循环队列是一种先进先出(FIFO)的数据结构,而链队列是一种后进先出(LIFO)的数据结构。循环队列通过两个指针(一个头指针,一个尾指针)来管理队列,链队列则通过一个指针进行头尾指针的切换。在性能上,循环队列由于不需要额外的空间,因此比链队列更高效。然而,链队列在不需要考虑队列长度的情况下,可以更灵活地插入和删除元素。
chaibubble
2018/01/02
6120
数据结构-队列
数据结构 第三章栈和队列
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
十二惊惶
2024/02/28
4090
循环队列 基本概念「建议收藏」
循环队列是 队列的一种特殊形式。首先介绍队列,然后引申出循环队列。 队列又称为“先进先出”(FIFO)线性表 限定插入操作只能在队尾进行,而删除操作只能在队首进行 队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列
全栈程序员站长
2022/08/23
9090
循环队列 基本概念「建议收藏」
相关推荐
C语言实现顺序队列
更多 >
LV.2
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云运维技术交流群
云平台运维技巧 分布式系统排障
加入云原生工作实战群
云原生落地实践 技术难题攻坚探讨
加入前端工作实战群
前端工程化实践 组件库开发经验分享
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档