线性结构_循环队列

来源:互联网 发布:点赞功能数据库设计 编辑:程序博客网 时间:2024/06/11 23:03
线性结构的应用--队列
定义:一种可以实现先进先出的存储结构。
分类:链式队列:用链表实现
静态队列:用数组实现(循环队列)

循环队列:
1、静态队列为什么必须是循环队列:队列的结构是先进先出的,循环队列可对内存重复使用,减少对内存的浪费。
2、循环队列需要几个参数来确定:2个参数:front和rear
3、循环队列各个参数的含义
这两个参数在不同场合有不同的含义:
1)、队列的初始化:front和rear的值都是零
2)、队列非空:front代表第一个元素,rear代表最后一个有效元素的下一个元素。
3)、队列为空:front和rear相等但不一定为零。
4、循环队列入队的伪算法:两步完成
1)、将值存入r所代表的位置
2)、错误写法:rear = rear + 1; 正确写法:rear = (rear + 1)%数组的长度
5、循环队列出队的伪算法:front = (front + 1)%数组长度
6、如何判断循环队列是否为空:如果rear和front相等,则队列为空。
7、如何判断循环队列是否已满:(当front==rear时,无法判断队列为空或满)
1)只用n-1个元素,队列满时rear与front紧挨着(哪个在左边的判断)
2)使用一个变量标识参数,统计元素个数
循环队列中,front与rear的大小关系没有规律,初始化队列时,front与rear的值都为零,但随着队列的不断插入与删除,front与rear的大小关系不确定。最初元素入队阶段,rear的值增加,rear的值比front大,但随着队列元素的处队,以及新元素入队进入循环队列,会出现front的值比rear大的情况。
经常使用的是第一种方法,判断结果如下:
if((rear + 1) % 数组长度 == f){队列已满}
else{队列未满}
队列的具体运用:所有与时间有关的场合都有队列的影子。
#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct Queue {int *pBase;int front;int rear;} QUEUE;void init_Queue(QUEUE*);bool en_Queue(QUEUE*, int);//入队bool out_Queue(QUEUE*, int*);//出队bool full_Queue(QUEUE*);//判断队列是否已满bool empty_Queue(QUEUE*);//判断队列是否为空void traverse_Queue(QUEUE *);//遍历队列int main() {QUEUE Q;int val;init_Queue(&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);for (int i = 0; i < 8; i++) {if (out_Queue(&Q, &val)) {printf("出队成功,出队的元素是:%d\n", val);}else {printf("出队失败。\n");}traverse_Queue(&Q);}return 0;}void init_Queue(QUEUE *pQ) {pQ->pBase = (int*)malloc(sizeof(int) * 6);//创建一个pBase数组,有6个元素,但只存放5个元素,pBase指向数组的第一个元素pQ->front = 0;pQ->rear = 0;}/*循环队列入队的伪算法:两步完成1)、将值存入r所代表的位置2)、错误写法:rear = rear + 1; 正确写法:rear = (rear + 1) % 数组的长度*/bool en_Queue(QUEUE *pQ, int val) {if (full_Queue(pQ)) {return false;}else {pQ->pBase[pQ->rear] = val;pQ->rear = (pQ->rear + 1) % 6;return true;}}/*如何判断循环队列是否已满:(当front == rear时,无法判断队列为空或满)1)只用n - 1个元素,队列满时rear与front紧挨着(哪个在左边的判断)2)使用一个变量标识参数,统计元素个数经常使用的是第一种方法,判断结果如下:if ((rear + 1) % 数组长度 == f) { 队列已满 }else { 队列未满 }*/bool full_Queue(QUEUE *pQ) {if ((pQ->rear + 1) % 6 == pQ->front) {return true;}else return false;}/*循环队列出队的伪算法:front = (front + 1)%数组长度*/bool out_Queue(QUEUE* pQ, int* pVal) {if (empty_Queue(pQ)) {return false;}else {*pVal = pQ->pBase[pQ->front];pQ->front = (pQ->front + 1) % 6;return true;}}/*队列为空:front和rear相等但不一定为零。*/bool empty_Queue(QUEUE* pQ) {if (pQ->front == pQ->rear) {return true;}else return false;}/*遍历队列从队列的front处开始遍历创建一个统计变量cnt,当cnt等于rear时,遍历输出终止因为rear指向的时最后一个元素的下一个位置,不存在数据*/void traverse_Queue(QUEUE *pQ) {int cnt = pQ->front;while (cnt != pQ->rear) {printf("%d ", pQ->pBase[cnt]);cnt = (cnt + 1) % 6;}printf("\n");return;}

0 0