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语言
线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...
随机推荐
- PAT1058:A+B in Hogwarts
1058. A+B in Hogwarts (20) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If you ...
- ZooKeeper的使用---Java程序
一.导入库 以下库存放在目录lib中: audience-annotations-0.5.0.jar jline-0.9.94.jar log4j-1.2.17.jar netty-3.10.6.Fi ...
- Centos7 下 tty2等文字窗口的中文乱码问题分析
在使用 tty 的时候遇到了一个事情,那就是主文件夹下面的中文文件是乱码: [备注]tty 是 通过 CTRL + ALT +F2~F6 获得的, 这与桌面系统中的终端不是一个概念, 望看到这篇 ...
- python3的文件读取问题
今天在调python程序时,遇到了一个报错:illegal multibyte sequence. 后来在网上查资料,是文件读取的编码问题. py3读取文件的时候是可以指定编码的:open('file ...
- Python常用算法(二)
1.快速排序 过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 一般选取第一个数作为关键数据k,我们要把比k小的所有数据移到它的左面,从后往前找第一个比它 ...
- selenium+python+eclipse 实现 “问卷星”网站,登录与检查登录示例!
1.使用selenium+python+eclipse实现的登录"问卷星",问卷星访问地址:https://www.sojump.com/ 2.实现步骤:1)进入链接---首页-- ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- Shell 脚本中调用另一个 Shell 脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- 蚂蚁通讯框架SOFABolt之私有通讯协议设计
前言 SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架. 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO ...
- TensorFlow从1到2(八)过拟合和欠拟合的优化
<从锅炉工到AI专家(6)>一文中,我们把神经网络模型降维,简单的在二维空间中介绍了过拟合和欠拟合的现象和解决方法.但是因为条件所限,在该文中我们只介绍了理论,并没有实际观察现象和应对. ...