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

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

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

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. Netty中的连接管理

    连接管理是我们首先需要关注的,检测空闲连接以及超时对于及时释放资源来说是至关重要的.由于这是一项常见的任务,Netty特地为它提供了几个ChannelHandler实现. 用于空闲连接以及超时的Cha ...

  2. C语言检查ip是否合法

    在工作当中我们经常会遇到这种问题:判断一个输入的字符串是否为合法的IP地址,下面是一个测试小程序: #include <stdio.h> #include <string.h> ...

  3. Java的锁

    今天练习了Java的多线程,提到多线程就基本就会用到锁 Java通过关键字及几个类实现了锁的机制,这里先介绍下Java都有哪些锁:   一.Java实现锁的机制: Java运行到包含锁的代码时,获取尝 ...

  4. django从0到1搭建网站

    曾经有人说我前端很水,那么在这一系列文章中我打算把前后端融合在一起来做一次网站的全面重构,希望可以把刚刚入行的同学带上正途   请尊重原创,转载请注明来源网站www.shareditor.com以及原 ...

  5. java获取一个月的天数

    import java.text.SimpleDateFormat; import java.util.Calendar; public class Test { public static void ...

  6. Oracle12c中功能及性能新特点之with子句的增强

    1. 设置创建测试表.DROP TABLE test PURGE; CREATE TABLE test ASSELECT 1 AS idFROM   dualCONNECT BY level < ...

  7. 【译文】CSS技术:如何正确的塑造button样式!

    , but useful for */ display: inline-block; text-align: center; text-decoration: none; /* create a sm ...

  8. JavaScript 异步开发全攻略(转)

    写了一本介绍 JavaScript 异步开发的小书: https://meathill.gitbooks.io/javascript-async-tutorial/content/ 除了比较详细的介绍 ...

  9. BootStrapTable获取选中数据值并传参至父页面

    如何实现以下效果呢? 首先,我们先要了解一下BootStrapTable如何获取选中数据的具体值. 如下图所示,怎样选择任意一行,获取其中的数据 一.首先想要选择任意一行,就得必须先有选择框,选择框是 ...

  10. [NOIP2014]飞扬的小鸟 D1 T3 loj2500 洛谷P1941

    分析: 这是一个DP,没什么好说的,细节很烦人. DP[i][j]表示到第i个位置,高度为j点最少的次数. 转移: 当j=m时 k属于[m-h,m]都可以向DP[i][j]转移,即dp[i][j]=m ...