队列的实现
来源:互联网 发布:iphone airplay mac 编辑:程序博客网 时间:2024/04/28 07:46
1、循环队列
一开始使用数组来表示队列,但是会造成很多的数据搬移,效率太低,所以考虑使用循环队列。
循环队列的约定如下:
- 用a[0] - a[maxsize - 1]来表示整个队列
- 最开始是rear == front ==0
- 空出一个字节,用来辨别空队列和满队列(当rear == front的时候,毫无疑问是空队列,当(rear + 1)%maxsize == front的时候,表示满队列)
如下图所示:
2、功能定义
#include <stdio.h>#include <string.h>#define MAXSIZE 100/*因为普通数组来实现队列,需要涉及到很多数据搬移,所以使用循环队列 *而对于循环队列,在分辨其满和空时,会有一些困难。 *可以采用两种方法 *1、增加一个成员变量,来表明其满或者空 *2、空出一个数组成员,用来判别 */typedef struct{int queue[MAXSIZE];int front;int rear;//int state; //仅在循环队列中使用} SqQueue;void CreateQueue(SqQueue **p);void InQueue(SqQueue *p, int value);void OutQueue(SqQueue *p);int IsEmpty(SqQueue *p);int IsFull(SqQueue *p);void PrintQueue(SqQueue *p);
3、函数实现(注意边界条件)
void main(){SqQueue *p;CreateQueue(&p);InQueue(p, 1);InQueue(p, 2);PrintQueue(p);OutQueue(p);}void CreateQueue(SqQueue **p){*p = (SqQueue *)malloc(sizeof(SqQueue));(*p)->front = 0;(*p)->rear = 0;}void InQueue(SqQueue *p, int value){assert(!IsFull(p));p->rear++;p->rear = p->rear % MAXSIZE;p->queue[p->rear] = value;}void OutQueue(SqQueue *p){assert(!IsEmpty(p));p->front = (p->front + 1) % MAXSIZE;}int IsFull(SqQueue *p){return (p->rear + 1) % MAXSIZE == p->front;}int IsEmpty(SqQueue *p){return p->rear == p->front;}
打印函数
为什么这个函数要单独拿出来?
因为在编写该函数的时候,我曾多次的出现各种问题。
- 在循环输出的时候,直接对p->front和p->rear进行操作
- 在循环判断的时候,使用p->front%maxsize <=p->rear,却没有意识到做了余数后,该式会一直成立
- 队列的实现:顺序队列
- 队列的实现:链式队列
- 队列----循环队列的实现
- 队列实现 队列的链式结构实现
- 堆栈,队列的实现
- 链队列的实现
- 队列的实现
- 队列的实现
- java 实现的队列
- 工作队列的实现
- 工作队列的实现
- 用链表实现的队列
- 队列的实现
- 队列的实现
- 队列的实现
- 队列的数组实现
- 循环队列的实现
- 数据结构 队列的实现
- 数据库设计准则(第一、第二、第三范式说明)------即数据库设计经典三范式!
- Js最常用的55个技巧
- Flex Viewer开发初学
- Go语言开发工具LiteIDE
- 《火球——UML大战需求分析》(第3章 分析业务模型-类图)——3.8 小结与练习
- 队列的实现
- gdb 查看core文件时的一些操作
- 红帽集群套件RHCS四部曲(实战篇)
- 百度快照日期对网站的意义
- Ubuntu安装Mysql
- javascript正则表达式分组匹配
- android度量单位的黄金定律
- iOS 之点击按钮改变状态的图片
- ajax框架封装