文章目录
前言
本文根据郝斌老师的指导记录数据结构之循环队列。
一、关于循环队列的一些问题
1、队列的2个参数不同场合有不同含义
①队列的初始化
front和rear的值是零
②队列非空
front代表的是队列的第一个元素
rear代表是队列的最后一个有效元素的下一个元素
③队列空
front和rear的值相等,但不一定是零
2、循环队列入队伪算法讲解
①将值存入r所代表的位置
②rear = (rear + 1) % 数组的长度
3、循环队列出队伪算法讲解
front = (front + 1 ) % 数组的长度
4、如何判断循环队列是否为空
如果front与rear的值相等,则该队列一定为空
5、如何判断循环队列是否已满
预备知识:
front的值可能比rear大,
front的值也可能比rear小,
当然两者也可能相等。
少用一个元素
如果rear和front的值紧挨着,则队列已满。
if(rear + 1) % 数组的长度 == front)
已满
else
不满
二、代码
代码如下(示例):
#include <stdio.h>
#include <malloc.h>
typedef struct Queue {
int* pBase;
int front;
int rear;
}QUEUE;
void Init_Queue(QUEUE* pQ); //初始化循环队列
bool En_Queue(QUEUE* pQ, int val); //入队
bool Full_Queue(QUEUE* pQ); //判断循环队列是否为满
void Traverse_Queue(QUEUE* pQ); //遍历循环队列
bool Out_Queue(QUEUE* pQ, int* val); //出队
bool Empty_Queue(QUEUE* pQ); //判断循环队列是否为空
int main(void) {
int a;
QUEUE Q;
Init_Queue(&Q);
En_Queue(&Q, 1);
En_Queue(&Q, 2);
En_Queue(&Q, 3);
En_Queue(&Q, 4);
En_Queue(&Q, 5);
Traverse_Queue(&Q);
Out_Queue(&Q, &a);
Traverse_Queue(&Q);
printf("出队的元素是:%d\n", a);
return 0;
}
//循环队列初始化
void Init_Queue(QUEUE* pQ) {
pQ->pBase = (int*)malloc( 6 * sizeof(int) ); //动态分配内存空间
pQ->front = 0;
pQ->rear = 0;
return ;
}
//进队
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;
}
}
//出队
bool Out_Queue(QUEUE* pQ, int* val) {
if( Empty_Queue(pQ) ){
return false;
} else {
int* p;
p = &pQ->pBase[pQ->front];
*val = *p;
pQ->front = (pQ->front + 1) % 6;
//free(p);
//p = NULL;
return true;
}
}
//先定义一个普通变量指向循环队列的头部front,如果没有指向rear就一直输出
void Traverse_Queue(QUEUE* pQ) {
int p;
p = pQ->front;
while( p != pQ->rear ) {
printf("%d ", pQ->pBase[p]);
p = (p + 1) % 6;
}
printf("\n");
return ;
}
//判断循环队列是否为满
bool Full_Queue(QUEUE* pQ) {
if( (pQ->rear+1) % 6 == pQ->front) {
return true;
} else {
return false;
}
}
//判断循环队列是否为空
bool Empty_Queue(QUEUE* pQ) {
if( pQ->front == pQ->rear ) {
return true;
}
else {
return false;
}
}
显示结果: