数据结构复习之[循环队列]
来源:互联网 发布:Java接口技术 编辑:程序博客网 时间:2024/05/02 02:53
这算是我第一篇原创吧,就写一写我今天的学习笔记。
以下复习笔记来自郝斌老师的数据结构视频,在verycd下免费下载,通俗易懂的特点是初学者不可多得的。
线性结构的两种常见应用之二队列
定义:
一种可以实现“先进先出”的存储结构。
分类:
离散(链式)队列--用链表实现
静态(连续)队列--用数组实现
静态队列通常必须是循环队列
循环队列的必须要弄清除的7个问题:
1.静态队列为什么必须是循环队列
由于连续空间的问题,为了节省空间,方便操作,速度快等优点。
2.循环队列需要几个参数来确定
需要2个参数来确定
3.循环队列各个参数的含义
2个参数不同场合有不同的含义
1).队列初始化
front = rear = 0
2).队列非空
front代表的是队列的第一个元素
rear代表的是队列的最后一个有效元素
3).队列空
front = rear 但不一定为零
4.循环队列入队伪算法讲解
两步完成:
1.将值存入rear所代表的位置
2.错误的写法:rear= rear+ 1;
正确的写法:rear=(rear+ 1)%数组的长度
5.循环队列出队伪算法讲解
front=(front+ 1)%数组的长度
6.如何判断循环队列是否为空
如果front与 rear的值相等,
则该队列就一定为空
7.如何判断循环队列是否已满
预备知识:
front的值可能比rear大,可能比他小,也可能相等
两种方式:
1.多增加一个标识参数
2.不用数组的最后一个元素[通常使用第二种方式]
如果rear和 front的值紧挨着,则队列已满
if((rear+1)%数组长度== front)
已满
else
不满
循环队列程序演示:
#include <stdio.h>#include <stdlib.h>#define M 6 //数组长度#define bool char //c语言中没有bool类型,自己添加的#define true 1#define false 0typedef struct Queue{ int * pBase;//数组首地址,相当于数组名 int front; int rear;}QUEUE;void init(QUEUE *);//初始化队列bool en_queue(QUEUE *,int);//入队列bool out_queue(QUEUE *, int *);//出队列void traverse_queue(QUEUE *);//遍历队列bool full_queue(QUEUE *);//判断队列是否为满bool empty_queue(QUEUE *);//判断队列是否为空int main (int argc, const char * argv[]){ QUEUE Q; int val; init(&Q); //测试数据 en_queue(&Q, 1); en_queue(&Q, 2); en_queue(&Q, 3); en_queue(&Q, 4); en_queue(&Q, 5); en_queue(&Q, 6); en_queue(&Q, 7); en_queue(&Q, 8); traverse_queue(&Q); if (out_queue(&Q, &val)) { printf("出队成功,队列出队元素为:%d\n",val); } else printf("出队失败!"); traverse_queue(&Q); return 0;}void init(QUEUE *pQ){//初始化队列 pQ->pBase = (int *)malloc(sizeof(int) * M); pQ->front = 0; pQ->rear = 0; return;}bool full_queue(QUEUE * pQ){//队列是否为满 if ((pQ->rear + 1) % M == pQ->front) { return true; } else return false;}bool en_queue(QUEUE * pQ,int val) {//入队列 if (full_queue(pQ)) { return false; } else { pQ->pBase[pQ->rear] = val; pQ->rear = (pQ->rear + 1) % M; return true; }}void traverse_queue(QUEUE * pQ){//遍历队列 int i = pQ->front; while(i != pQ->rear) { printf("%d ",pQ->pBase[i]); i = (i+1) % M; } return; }bool empty_queue(QUEUE * pQ){//队列是否为空 if (pQ->front == pQ->rear) { return true; } else return false; }bool out_queue(QUEUE * pQ, int * pVal){//出队列 if (empty_queue(pQ)) { return false; } else { *pVal = pQ->pBase[pQ->front]; pQ->front = (pQ->front + 1) % M; return true; }}
本程序经mac和windows下测试通过。
队列的具体应用:
所有和时间有关的操作都有队列的影子,比如操作系统中的调度原则等。
- 数据结构复习之[循环队列]
- 数据结构复习之[循环队列]
- 复习数据结构之循环队列
- 数据结构复习之【队列】
- 复习数据结构之队列
- 数据结构之【队列】--复习
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构 之 循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 数据结构之循环队列
- 帮学院里一个10级童鞋宣传的一个社会调查——“我与计算机专业” 走过路过的帮忙下吧。。。~先谢谢啦~
- 一步步学Qt,第四天-Qt 建立MainWindow的小小bug处理
- Linux服务器性能评估与优化
- 让MFC的 WebBrowser 控件 使用IE8或以上的内核(默认是IE7) 并且使用IE按钮样式
- 关于DateTime?(可为空),Decimal?类型的格式化方法
- 数据结构复习之[循环队列]
- TMD 中国网速为何这么慢!!!
- 关于arm ads 上RO_BASE对程序速度的影响
- 编程修养
- 如何解决分布式系统中的跨时区问题
- 标准化考试总结2011-8-28
- PKU3630
- 分享30个优秀的iPad界面设计案例
- Java 短路运算符和非短路运算符