今日在处理数据存储的问题中,数据占用的空间较大,在询问之下,提及循环队列。

没有学习过的我,想想就是头大,只能慢慢从网上找资料,一个字母一个字母的敲,最后,还是慢慢的对队列有了一些理解

对于循环队列有几个操作:

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语言实现循环队列的更多相关文章

  1. C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...

  2. C语言实现循环队列的初始化&进队&出队&读取队头元素&判空-2

    /*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Si ...

  3. C语言实现 循环队列

    #include <stdio.h>#include <stdlib.h>#include <stdbool.h> typedef struct queue{ in ...

  4. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  5. C语言实现使用动态数组实现循环队列

    我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...

  6. 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)

    这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...

  7. c语言编程之循环队列

    利用链表实现的循环队列,完成了队列的入队和出队,对于队空和队满用了一个flag进行标记.入队flag++,出队flag-- #include"stdio.h" typedef in ...

  8. 数据结构:循环队列(C语言实现)

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

  9. 队列(循环队列)----C语言

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...

随机推荐

  1. PAT1003:Emergency

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  2. 多个DbContext修改同一张表测试

    多个DbContext修改同一张表经测试是可行的. UserStore和DepartmentStore都可以向SysLog表写入数据 用多个线程同时通过UserStore和DepartmentStor ...

  3. 分布式任务系统gearman的python实战

    Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统.Gearman是一个分发任务的程序框架,可以 ...

  4. xml序列化和反序列化(二)

    上篇讲到关于xml入参实体序列化,下面给出出参实体反序列化,代码如下: /// <summary> /// 反序列化 /// </summary> /// <param ...

  5. 可能是迄今为止最好的GitHub代码浏览插件--赞

    https://chrome.google.com/webstore/category/extensions?hl=zh-CN 搜索"insight.io" chrome://ex ...

  6. JavaScript 设计模式之----单体(单例)模式

    设计模式之--单体(单例)模式 1.介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工 ...

  7. 在centos上面安装phantomjs

    在opt目录下创建phantomjs文件夹 mkdir -p /opt/phantomjs 把phantomjs解压出来的的文件放到/opt/phantomjs下面 建立软链接 ln -s /opt/ ...

  8. TestNG教程网站

    比较简明的一些TestNG教程网站 : https://www.jianshu.com/p/74816a200221 http://www.yiibai.com/testng/parameterize ...

  9. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  10. go语言nsq源码解读五 nsqlookupd源码registration_db.go

    本篇将讲解registration_db.go文件. 1234567891011121314151617181920212223242526272829303132333435363738394041 ...