循环队列的C语言实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题
一、循环队列的基础知识
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语言实现的更多相关文章
- 数据结构:循环队列(C语言实现)
生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...
- 队列(循环队列)----C语言
线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- C语言实现使用动态数组实现循环队列
我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...
- 数据结构(C语言版)---第三章栈和队列 3.4.2 队列的链式表示和实现(循环队列)
这个是循环队列的实现,至于串及数组这两章,等有空再看,下面将学习树. 源码如下: #include <stdio.h> #include <stdlib.h> #define ...
- c语言编程之循环队列
利用链表实现的循环队列,完成了队列的入队和出队,对于队空和队满用了一个flag进行标记.入队flag++,出队flag-- #include"stdio.h" typedef in ...
- C语言实现循环队列
今日在处理数据存储的问题中,数据占用的空间较大,在询问之下,提及循环队列. 没有学习过的我,想想就是头大,只能慢慢从网上找资料,一个字母一个字母的敲,最后,还是慢慢的对队列有了一些理解 对于循环队列有 ...
- C语言实现循环队列的初始化&进队&出队&读取队头元素&判空-2
/*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Si ...
随机推荐
- Linux下通过进程名查询占用的端口
1.首先根据名称用ps命令查看进程ID: ps -ef | grep zookeeper jim 10997 1959 0 12月14 pts/2 00:00:01 /usr/lib/jvm/java ...
- [TJOI2014]Alice and Bob[拓扑排序+贪心]
题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...
- restful framework之频率组件
一.频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二.自定义频率类.自定义频率规则 自定义的逻辑 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去 ...
- mvn本地部署命令行
---创建mvn项目 mvn archetype:generate 运行结果如下: ---调试mvn仓库 mvn archetype:generate –X 运行结果如下: ---创建依赖 mvn a ...
- 使用web api开发微信公众号,调用图灵机器人接口(一)
此文将分两篇讲解,主要分为以下几步 签名校验; 首次提交验证申请; 接收消息; 被动响应消息(返回XML); 映射图灵消息及微信消息; 其实图灵机器人搭载微信公众号很简单,只需要把图灵的地址配到公众后 ...
- SpringBoot日记——实战篇——Url定向
搞定了SpringBoot的一些基础核心的东西,我们需要实践一个项目来确认自己学习的东西能被应用,最初,我们会选择自己写一个登陆页面,这也是每个网站几乎都有的门面. 在写之前,还有一些知识点需要记录— ...
- python中的运算符的分类以及使用方法
1.算数运算符 算数运算符的分类: +, –, *, **(幂运算), /, //(整除), %(取余/取模) 算数运算符的优先级: ()> ** > *, /, % &g ...
- 从零搭建HBase集群
本文从零开始搭建大数据集群,涉及Linux集群安装搭建,Hadoop集群搭建,HBase集群搭建,Java接口封装,对接Java的C#类库封装 Linux集群搭建与配置 Hadoop集群搭建与配置 H ...
- Jupyter安装及运行
一.安装(来自http://jupyter.org/install) Ctrl+Alt+T(Manjaro系统),打开控制台,su进入root权限 输入如下命令: python3 -m pip ins ...
- python图像处理(1)图像的打开与保存
使用python进行图像处理时有三种库可以使用分别是:PIL.matplotlib.pyplot.opencv(opencv未接触) 注意:matplotlib读取进来的图片是unit8,0-255范 ...