概述
顺序队使用循环队列来避免“假溢出”问题。
循环队列的四个要素:
(1)两个状态
- 队空状态:qu.rear==qu.front
- 队满状态:(qu.rear+1)%maxSize==qu.front
(2)两个操作
- 元素x进队操作(移动队尾指针):qu.rear=(qu.rear+1)%maxSize;qu.data[qu.rear]=x;
- 元素x出队操作(移动队首指针):qu.front=(qu.front+1)%maxSize;x=qu.data[qu.front];
代码
#include<stdio.h>
#define maxSize 20
/* 顺序队类型定义 */
typedef struct {
int data[maxSize];
int front;// 队首指针
int rear;// 队尾指针
} SqQueue;
/* 初始化队列 */
void initQueue(SqQueue &qu) {
qu.front=qu.rear=0;// 队首和队尾指针重合并指向0
}
/* 判断队空 */
int isQueueEmpty(SqQueue qu) {
if(qu.front==qu.rear) { // 无论队首、队尾指针指向数组中的哪个位置,只要两者重合,即为队空
return 1;
} else {
return 0;
}
}
/* 判断队满 */
int isQueueFull(SqQueue qu) {
if((qu.rear+1)%maxSize==qu.front) {
return 1;
} else {
return 0;
}
}
/* 入队 */
int enQueue(SqQueue &qu,int x) {
if((qu.rear+1)%maxSize==qu.front) {
return 0;
} else {
qu.rear=(qu.rear+1)%maxSize;// 若队未满,则移动指针
qu.data[qu.rear]=x;// 再存入元素
return 1;
}
}
/* 出队 */
int deQueue(SqQueue &qu,int &x) {
if(qu.rear==qu.front) { // 若队空,则不能出队
return 0;
} else {
qu.front=(qu.front+1)%maxSize;// 若队不空,则移动指针
x=qu.data[qu.front];// 再取出元素
return 1;
}
}
/* 打印循环队列 */
void printQueue(SqQueue qu) {
printf("\n打印循环队列:");
while(qu.rear!=qu.front) {
qu.front=(qu.front+1)%maxSize;
printf("%d\t",qu.data[qu.front]);
}
printf("\n");
}
int main() {
SqQueue qu;
/* 初始化队列 */
initQueue(qu);
/* 入队 */
int nums[]= {1,2,3,4,5,6,7,8,9,10,11};
int n=11;
for(int i=0; i<n; i++) {
enQueue(qu,nums[i]);// 将数组中的元素入队
}
printQueue(qu);// 打印队列
printf("\n");
/* 出队 */
int x;
deQueue(qu,x);// 将元素1出队
printf("出队元素:%d",x);
printQueue(qu);
printf("\n");
deQueue(qu,x);// 将元素2出队
printf("出队元素:%d",x);
printQueue(qu);
printf("\n");
deQueue(qu,x);// 将元素3出队
printf("出队元素:%d",x);
printQueue(qu);
return 0;
}
运行结果: