C语言实现循环队列
今日在处理数据存储的问题中,数据占用的空间较大,在询问之下,提及循环队列。
对于循环队列有几个操作:
1、初始化
2、入队
3、出队
4、遍历队列
5、判队列空,判队列满
具体如何实现,我会在下面通过代码实现
在对循环队列操作之前,先要建立队列结构体元素,
typedef struct Queue
{
int * BUF;
int front;
int rear;
}QUEUE;
1、初始化
初始化,需要完成的工作是,为新建的队列分配内存空间,然后在将头尾指针置零
void initQueue(QUEUE *queue_q)
{
queue_q->BUF = (int *)malloc(sizeof(int)*BUF_SIZE);
if(queue_q->BUF != NULL) //队列内存分配成功
{
queue_q->front = queue_q->rear = ; //初始化头尾指针
} }
2、入队
入队主要是将数据放到内存中,但是应该放到那一段内存,这就是一个问题了,
在此,在入队的时候,循环队列的头指针不做动作,尾指针向后偏移
实现代码如下:
其中的 BUF_SIZE 为循环队列的空间大小吗,但是实际能存储的数据字节数是(BUF_SIZE - 1)
#define BUF_SIZE 8
void In_Queue(QUEUE *queue_q , int value)
{
if(is_fullQueue(queue_q) != true) //队列未满
{
queue_q->BUF[queue_q->rear] = value;
queue_q->rear = (queue_q->rear + )%BUF_SIZE ; //尾指针偏移
}
}
细心的人会注意到函数 is_fullQueue(queue_q) ,这是对循环队列进行判断,看是不是满了,应该队列的空间是有限的,对于满的队列,无法进行数据入队操作
具体函数如下:
unsigned char is_fullQueue(QUEUE *queue_q)
{
if((queue_q->rear +)%BUF_SIZE == queue_q->front)
{
return true;
}else
return false;
}
同样,存在一个判空函数,函数的原理是:头指针 = 尾指针
实现代码如下:
unsigned char isemptyQueue(QUEUE *queue_q)
{
if(queue_q->front == queue_q->rear)
{
return true;
}
else
return false;
}
3、出队
出队是将头指针位置下的数据取出来,然后头指针偏移到被取数据的位置
代码实现如下:
void out_Queue(QUEUE *queue_q , int *value)
{
if(isemptyQueue(queue_q) != true) //队列未空
{
*value = queue_q->BUF[queue_q->front];
queue_q->front = (queue_q->front + )%BUF_SIZE ;
}
}
入队要判满,出队则要判空。
因为空的队列,没办法取数据
4、遍历队列
这就是一个简单的打印函数,没什么好说的
唯一需要注意的就是,遍历是出队操作,操作的是头指针,若头指针 = 尾指针,遍历完毕,循环队列为空
void bianli_a(QUEUE *queue_q)
{
if(isemptyQueue(queue_q) != true)
{
int ret=queue_q->front;
while(ret != queue_q->rear)
{
printf("%d ",queue_q->BUF[ret]);
ret=(ret+)%BUF_SIZE;
}
}
}
下面是我学习循环队列的时候,写的代码,若有指教,请评论:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> #define true 1
#define false 0
#define BUF_SIZE 8
typedef struct Queue
{
int * BUF;
int front;
int rear;
}QUEUE; void initQueue(QUEUE *queue_q)
{
queue_q->BUF = (int *)malloc(sizeof(int)*BUF_SIZE);
if(queue_q->BUF != NULL) //队列内存分配成功
{
queue_q->front = queue_q->rear = ; //初始化头尾指针
} } //判空
unsigned char isemptyQueue(QUEUE *queue_q)
{
if(queue_q->front == queue_q->rear)
{
return true;
}
else
return false;
} //判满
unsigned char is_fullQueue(QUEUE *queue_q)
{
if((queue_q->rear +)%BUF_SIZE == queue_q->front)
{
return true;
}else
return false;
} //入队 void In_Queue(QUEUE *queue_q , int value)
{
if(is_fullQueue(queue_q) != true) //队列未满
{
queue_q->BUF[queue_q->rear] = value;
queue_q->rear = (queue_q->rear + )%BUF_SIZE ; //尾指针偏移
}
} //出队
void out_Queue(QUEUE *queue_q , int *value)
{
if(isemptyQueue(queue_q) != true) //队列未空
{
*value = queue_q->BUF[queue_q->front];
queue_q->front = (queue_q->front + )%BUF_SIZE ;
}
} void bianli_a(QUEUE *queue_q)
{
if(isemptyQueue(queue_q) != true)
{
int ret=queue_q->front;
while(ret != queue_q->rear)
{
printf("%d ",queue_q->BUF[ret]);
ret=(ret+)%BUF_SIZE;
}
}
} int main()
{
int val;
QUEUE m;
initQueue(&m);
In_Queue(&m,);
In_Queue(&m,);
In_Queue(&m,);
bianli_a(&m);
printf("\n");
out_Queue(&m,&val);
bianli_a(&m);
return ;
}
C语言实现循环队列的更多相关文章
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- C语言实现循环队列的初始化&进队&出队&读取队头元素&判空-2
/*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Si ...
- C语言实现 循环队列
#include <stdio.h>#include <stdlib.h>#include <stdbool.h> typedef struct queue{ in ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- C语言实现使用动态数组实现循环队列
我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...
- 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)
这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...
- c语言编程之循环队列
利用链表实现的循环队列,完成了队列的入队和出队,对于队空和队满用了一个flag进行标记.入队flag++,出队flag-- #include"stdio.h" typedef in ...
- 数据结构:循环队列(C语言实现)
生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...
- 队列(循环队列)----C语言
线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...
随机推荐
- 网上整理的对于Rest和Restful api的理解
一.什么是Rest? REST不是"rest"这个单词,而是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移,但这个翻译 ...
- 消息中间件activemq的使用场景介绍(结合springboot的示例)
一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使 ...
- 阅读GIC-500 Technical Reference Manual笔记
GIC-500是ARM GICv3的一个实现,它只支持ARMv8核和实现了GIC Stream协议的GIC CPU Interface,比如Cortex-A53. 关于GIC有四份相关文档:<C ...
- VirtualBox报错:不能为虚拟电脑XXX打开一个新任务
报错产生的背景 今天在这里下载了一个用于VirtualBox的Kali Linux虚拟机文件(使用VirtualBox可以直接打开使用,不用执行安装过程).但是将该文件导入到VirtualBox中之后 ...
- Sublime Text 3安装SFTP插件
前言: 最近在学习网页设计,陆续接触到了HTML.CSS和JavaScript,写的代码越来越多了,也越来越感觉到将代码上传到服务器上的流程太繁琐了.一开始我是用虚拟主机提供的控制面板下载上传网页代码 ...
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- +function ($) { "use strict";}(window.jQuery);全面分析
+function ($) { "use strict"; }(window.jQuery); 怎么理解? 匿名函数闭包 我们先来理一理函数表达式和函数声明的区别 函数表达式: 函 ...
- BZOJ_3436_小K的农场_差分约束
BZOJ_3436_小K的农场_差分约束 题意: 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述 ...
- LOJ_6178_景区路线规划
LOJ_6178_景区路线规划 题意: 游乐园被描述成一张 nnn 个点,mmm 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 iii 个娱乐项目需要耗费 cic_ici 分钟的时 ...
- BZOJ_3132_上帝造题的七分钟_树状数组
BZOJ_3132_上帝造题的七分钟_树状数组 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b), ...