生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题

一、循环队列的基础知识

1.循环队列需要几个参数来确定

  循环队列需要2个参数,front和rear

2.循环队列各个参数的含义

  (1)队列初始化时,front和rear值都为零;

  (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

  (3)当队列为空时,front与rear的值相等,但不一定为零;

3.循环队列入队的伪算法

  (1)把值存在rear所在的位置;

  (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;

程序代码:

if(IsFullQueue(Q))
return ;
else
{
Q->pBase[Q->rear]=val;
Q->rear=(Q->rear+)%Q->maxsize;
}
return ;

4.循环队列出队的伪算法

  (1)先保存出队的值;

  (2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;

程序代码:

if(IsEmptyQueue(Q))
{
return ;
}
else
{
*val=Q->pBase[Q->front];
Q->pBase[Q->front]=;
Q->front=(Q->front+)%Q->maxsize;
}
return ;

5.如何判断循环队列是否为空

  if(front==rear)

    队列空;

  else

   队列不空

程序代码:

if(Q->front==Q->rear)    //判断是否为空
return ;
else
return ;

6.如何判断循环队列是否为满

这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满。

程序代码:

if(Q->front==(Q->rear+)%Q->maxsize)    //判断循环链表是否满,留一个预留空间不用
return ;
else
return ;

附录:

queue.h文件代码:

#ifndef _QUEUE_SELF_H_
#define _QUEUE_SELF_H_ #include <stdint.h> typedef struct queue
{
uint16_t *pBase;
int16_t front; //指向队列第一个元素下标
int16_t rear; //指向队列最后一个元素的下一个元素的下标
int16_t maxsize; //循环队列的最大存储空间
}QUEUE,*PQUEUE; uint8_t CreateQueue(PQUEUE Q,int16_t maxsize);
uint8_t IsFullQueue(PQUEUE Q);
uint8_t IsEmptyQueue(PQUEUE Q);
uint8_t SendtoBackQueue(PQUEUE Q, uint16_t val);
uint8_t ReceivefromFrontQueue(PQUEUE Q, uint16_t *val); #endif /* _QUEUE_SELF_H_ */

queue.c文件代码:

#include"queue_self.h"
#include "stdlib.h" uint8_t CreateQueue(PQUEUE Q,int16_t maxsize)
{
Q->pBase=(uint16_t *)malloc(sizeof(uint16_t)*maxsize);
if(NULL==Q->pBase)
exit(-); //退出程序 Q->front=; //初始化参数
Q->rear=;
Q->maxsize=maxsize; return ;
} uint8_t IsFullQueue(PQUEUE Q)
{
if(Q->front==(Q->rear+)%Q->maxsize) //判断循环链表是否满,留一个预留空间不用
return ;
else
return ;
}
uint8_t IsEmptyQueue(PQUEUE Q)
{
if(Q->front==Q->rear) //判断是否为空
return ;
else
return ;
}
uint8_t SendtoBackQueue(PQUEUE Q, uint16_t val)
{
if(IsFullQueue(Q))
return ;
else
{
Q->pBase[Q->rear]=val;
Q->rear=(Q->rear+)%Q->maxsize;
}
return ;
} uint8_t ReceivefromFrontQueue(PQUEUE Q, uint16_t *val)
{
if(IsEmptyQueue(Q))
{
return ;
}
else
{
*val=Q->pBase[Q->front];
Q->pBase[Q->front]=;
Q->front=(Q->front+)%Q->maxsize;
}
return ;
}

循环队列的C语言实现的更多相关文章

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

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

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

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

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

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

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

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

  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语言实现循环队列的初始化&进队&出队&读取队头元素&判空-2

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

随机推荐

  1. Scala的静态方法和实例方法

    Scala的对象学习 Scala没有静态方法或静态字段,可以使用object这个语法达到相同的目的,对象定义了某个类的单个实例 object Accounts { private var lastNu ...

  2. 20155238 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    实验内容 使用JDK编译.运行简单的Java程序. 使用Eclipse 编辑.编译.运行.调试Java程序. 实现学生成绩管理功能,并进行测试. 实验步骤及结果 (一)命令行下Java程序开发 编译运 ...

  3. WPF 访问外部的xaml文件

    原文:WPF 访问外部的xaml文件 今天做主题时,需要访问外部的xaml文件,方法: using (FileStream s = new FileStream("C:\\Control.x ...

  4. Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)

    题目链接:Travelling Salesman and Special Numbers 题意: 给了一个n×m的图,图里面有'N','I','M','A'四种字符.问图中能构成NIMA这种序列最大个 ...

  5. cogs2479 偏序 cdq+树套树

    cdq+树状数组套替罪羊树. cdq归并a,树套树解决b,c. 记住平衡树树根不能暴力清零!!! // It is made by XZZ #include<cstdio> #includ ...

  6. 解决table td里面长串数字或字母不换行的问题

    在html中,经常要用到table标签,一般情况下,table下面的td元素里的东西都是汉字或者说是汉字.字母.数字的混合,在这种情况下,不设置table的宽度,也就是table宽度自适应的时候,浏览 ...

  7. Python distribute到底使用package_data还是MANIFEST.in?

    今天看Flask的文档,里面提到如何通过distribute发布你自己的Python包.讲包含文件的时候,提到要用MANIFEST.in并将include_package_data设置为True. 由 ...

  8. Maven 依赖节点总结

    首先是log4j: <!--哎,神特么的log4j,版本不对就Spring AOP前置增强 new不出来--><dependency> <groupId>log4j ...

  9. python中的运算符的分类以及使用方法

    1.算数运算符 算数运算符的分类: +, –,  *,  **(幂运算),   /,  //(整除),  %(取余/取模) 算数运算符的优先级:  ()>  ** > *, /, % &g ...

  10. 【10.13】Bug Bounty Write-up 总结

    今天惯例邮箱收到了Twitter的邮件提醒有新的post,这种邮件每天都能收到几封,正好看到一个Bug Bounty的write up,比较感兴趣,看起来也在我的理解范围之内,这里对这篇write u ...