数据结构学习(C语言)-循环队列
为什么要用循环队列?
先看下面的图
我们可以发现,不论我们是进行进队操作还是出队操作,用于标记位置的两个参数front(队首)和rear(队尾的下一个位置)在图中都是上移的。这也就意味着经过不断的出队操作,标记front下面的已申请空间越来越多,而且始终不会再次得到利用,从而造成空间的浪费。
但是如果我们使用循环队列就可以很好地解决这一问题。
循环队列基本操作的实例
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct QUEUE {
int * pBase;//用于指向申请数组第一个字节地址
int front;
int rear;
}Queue,* pQueue;
//函数声明
void initQueue(pQueue pQ);//初始化
bool isEmpty(pQueue);//队是否为空
bool isFull(pQueue);//队是否已满
void intoQueue(pQueue, int);//进队
void outQueue(pQueue, int *);//出队
void traverse(pQueue);//遍历
void clearQueue(pQueue);//清空
int main(void) {
Queue Q;
int pval;
initQueue(&Q);//初始化
intoQueue(&Q, 1);//进队
intoQueue(&Q, 2);
intoQueue(&Q, 3);
intoQueue(&Q, 4);
intoQueue(&Q, 5);
traverse(&Q);//遍历
outQueue(&Q,&pval);//出队
traverse(&Q);//遍历(出队验证)
clearQueue(&Q);//清空队列
if (isEmpty(&Q)) {//清空结果验证
printf_s("队已清空!\n");
}
return 0;
}
void initQueue(pQueue pQ){//初始化
pQ->pBase = (int *)malloc(sizeof(int)*6);//初始化申请6个空间
if (pQ->pBase == NULL) {
printf_s("动态分配空间失败!\n");
exit(-1);
}
else {
pQ->front = 0;
pQ->rear = 0;
}
return;
}
bool isEmpty(pQueue pQ){//对是否空
if (pQ->front == pQ->rear)
return true;
else
return false;
}
bool isFull(pQueue pQ){//队是否已满
if ((pQ->rear + 1) % 6 == pQ->front)
return true;
else
return false;
}
void intoQueue(pQueue pQ, int val){//进队
if (isFull(pQ)) {
printf_s("队已满,不能再进队操作!\n");
exit(-1);
}
else {
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear + 1) % 6;//rear后移,相当于队尾追加元素(即入队)
}
return;
}
void outQueue(pQueue pQ, int * pval){//出队
if (isEmpty(pQ)) {
printf_s("队为空,无法出队!\n");
exit(-1);
}
else {
*pval = pQ->pBase[pQ->front];
pQ->front = (pQ->front + 1) % 6;//front后移,相当于删除队首元素(即出队)
printf_s("队首元素:%d 已出队!\n",*pval);
}
return;
}
void traverse(pQueue pQ){//遍历
int p = pQ->front;
printf_s("循环队列中元素如下:\n");
while (p != pQ->rear) {
printf_s("%d ", pQ->pBase[p]);
p = (p + 1) % 6;
}
printf_s("\n");
}
void clearQueue(pQueue pQ) {//清空
while (pQ->front != pQ->rear) {
pQ->front = (pQ->front + 1) % 6;
}
}
运行结果展示: