循环队列
2015-08-29 11:16
211 查看
循环队列
前面队列小述中我们讲到了队列的链式存储结构,下面我们介绍下队列的顺序存储结构。假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端则是队头。
队列的顺序存储结构中,入队列就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。出队列则不同,我们已经假设下标为0的位置是队列的队头,因此,每次出队列操作,所有元素都需要向前移动,此时的时间复杂度为O(n)。
针对上述缺点我们提出循环队列。循环队列容量是固定的,并且它的队头和队尾指针都可以随着元素出入队列而发生改变。如果队列后面满了,就从头开始,达到一种循环的状态。(循环队列中的元素也是数组存储)
循环队列的存储结构:
初始化一个循环队列的代码:
循环队列中元素入列的代码:
前面队列小述中我们讲到了队列的链式存储结构,下面我们介绍下队列的顺序存储结构。假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端则是队头。
队列的顺序存储结构中,入队列就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。出队列则不同,我们已经假设下标为0的位置是队列的队头,因此,每次出队列操作,所有元素都需要向前移动,此时的时间复杂度为O(n)。
针对上述缺点我们提出循环队列。循环队列容量是固定的,并且它的队头和队尾指针都可以随着元素出入队列而发生改变。如果队列后面满了,就从头开始,达到一种循环的状态。(循环队列中的元素也是数组存储)
循环队列的存储结构:
#define MAXSIZE 100 typedef struct { ElemType *base;//用于存放内存分配基地址 ElemType aa[MAXSIZE];//也可以用数组存放 这两种方式任意选择一种 int front; int rear;// }cycleQueue;
初始化一个循环队列的代码:
void initQueue(cycleQueue *q) { q->base =(ElemType*)malloc(MAXSIZE*sizeof(ElemType)); if(!(q->base)) { exit(0); } q->front = q->rear = 0; }
循环队列中元素入列的代码:
int InsertQueue(cycleQueue *q,ElemType e) { if((q->rear + 1)/MAXSIZE==q->front)//假设队列中还有一个元素空的时候,此时队列的状态为满 { return -1; } q->base[q->rear] = e; q->rear = (q->rear + 1)%MAXSIZE; return 0; }循环队列中元素出列的代码:
int DeleteQueue(cycleQueue *q,ElemType *e) { if(q->rear ==q->front)//队列为空 { return -1; } *e = q->base[q->front]; q->front = (q->front + 1)%MAXSIZE; return 0; }
相关文章推荐
- SDUT-3302-效率至上-RMQ||线段树
- Hibernate分页(sql和hql)两种方法
- 常用排序算法总结---Java实现
- Leetcode: Palindrome Linked List
- Linux新手入门:Unable to locate package错误解决办法
- 4.solrj对索引的增删改查
- Win10 Mobile/PC版《照片》更新以及下载:Bug修复和性能优化
- HDU 1071 The area(计算几何)
- Java中实现CallBack功能
- matlab常用小函数(一)
- NGUI_2.6.3_(3D视图&ScrollView)
- cc、gcc、g++、CC的区别概括
- NSString转NSData,以及char*转NSData
- 少一点伤感
- 瀑布流布局——jquery
- 2015.8.28 字符串
- HDU 2955 Robberies
- 别让任何人偷走您的梦
- Android:透明状态栏的效果实现
- SDUT-3303-来发背包开开胃