队列的基础知识及实现方法
2017-03-23 11:23
141 查看
队列
在网上又看到关于队列的知识点,有很多,但都比较琐碎,有的还有些错误,为方便自己理解,特整理出一篇,顺便也加强记忆;当然,也附上我参考的博客地址:http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html href="http://http//www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html" target=_blank>点击打开链接
队列定义:队列属于先进先出型,First in first out(FIFO)
队列是一种特殊的线性表,只能在前端(front)进行删除操作,只能在后端(rear)进行删除操作;队列分为顺序队列和循环队列;顺序队列:
每次插入,指针rear加一,每次删除,指针front加一;(放一张百度的图片)在第四步中,front=rear,队列虽然判为空,却不能够再进行使用,因此造成了内存的浪费;所以就有了循环队列;
循环队列:
初始化时,rear = front=0,当队列不为空时,front指向队列中的第一个元素,rear指向队列中最后一个元素的下一个位置,当队列满时 rear=front,但不一定是位置0;插入后rear+1,删除后front+1,但是,无论是删除还是插入,一旦rear或front加一超过了所分配的空间,则让指针指向这片空间的起始位置;设所分配的空间为Maxsize,一旦rear+1,或front+1 =Maxsize, 则rear或front指向起始位置;如上图,当front和rear都在位置3事,此时如果想要插入,则判断3+1=4 与Maxsize 4的关系,相等,则rear=0,这个可以通过取余实现,rear=(rear+1)%Maxsize;
因此,循环序列判空的方法是rear = front; 判满的方法是 (rear+1)%Maxsize ==front;
进队列步骤: 1.判断队列是否满,即,rear+1是否等于front,若等于则队列已满,不允许进入;2. 若不满,则将值保存至rear+1的位置 ; 从这里也可以看出,循环数列所能存储的值其实是最大值-1, 如上图所示, maxsize是4, 若front =0, rear =3,这是位置3为空,但是判断的3+1 =4,则rear=(rear+1)%4 =0,则rear = front,显示队列已满,所以不能再插入,而其实还有一个空位。
void EnQueue(Queue *Q, int key)
{
if ( (Q->rear+1) % Q->maxsize == Q->front) //此时队列没有空间 取余保证,当quil=queuesize-1时,再转回0
{
printf("the queue has been filled full!");
}
else
{
Q->q[Q->rear] = key;
Q-> rear =(Q->rear+1) % Q->maxsize;
}
}
出队列步骤:1.判断数列是否为空; 2, 将front现在的时间表保存至temp; 3,将front指针后移一个;4. 返回temp;
int DeQueue(Queue *Q)
{
int tmp;
if(Q->rear== Q->front) //判断队列不为空
{
printf("the queue is NULL\n");
}
else
{
tmp = Q->q[q->front];
Q->front= (Q->front+1) % Q->maxsize;
}
return tmp;
}
相关文章推荐
- 加密和解密基础知识、linux上的私有CA实现方法、学习总结
- Python爬虫----基础知识(简单爬虫架构、URL管理器和实现方法)
- android基础知识28:Android实现计时与倒计时的几种方法
- iOS基础知识—最简单的get与set方法实现
- 基础知识之php页面缓存实现方法总结
- java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码
- Java基础知识强化18:抽象类、接口的区别 和 抽象类可以不实现接口的全部方法
- JAVA基础知识之多线程——三种实现多线程的方法及区别
- 回顾基础知识——实现阶乘计算的几种方法
- Python爬虫----基础知识(简单爬虫架构、URL管理器和实现方法)
- 基础知识--数组、栈、队列的静态、动态和链式实现
- 难道你真的不需要工作流概念和建模方法等等这些基础知识吗?
- asp.net 基础知识回顾1-response对象的write和redirect方法
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- [转帖]性能测试基础知识-性能的规划与实现
- 用Java实现HTTP文件队列下载-Java基础-Java-编程开发
- 光盘启动区基础知识(三) Nero超容量刻的详细方法
- 难道你真的不需要工作流概念和建模方法等等这些基础知识吗?
- 安全基础知识 细说暴库的原理与方法
- JAVA基础:用Java实现HTTP文件队列下载