题目
使用固定容量的循环数组结构实现一个简易先进先出队列(FIFO Queue),支持入队(push)、出队(pop)以及判空判满操作。
输入格式:多行指令:1 x 表示将 x 入队;0 表示出队并打印该值(队空输出 empty);-1 结束程序。
输出格式:响应出队操作,分行输出出队元素或 empty。
数据范围与约定:队列容量为 32。
思路与算法
1. 循环队列下标回绕
维护队头指针 front 和队尾指针 rear,移动时通过模运算 (idx + 1) % CAPACITY 实现数组空间的循环复用。
2. 判空与判满约定
常用方式:维护一个独立的 count 记录当前队列元素个数。入队时 count < CAPACITY,出队时 count > 0,逻辑清晰不易混淆。
完整程序
#include <stdio.h>
int main(void)
{
// 循环队列:利用取模实现环状数组,首尾指针滚动向前
int q[8], front = 0, rear = 0, size = 0;
for (;;) {
int op;
if (scanf("%d", &op) != 1) {
break;
}
if (op == -1) {
break;
}
if (op == 1) {
// 入队操作
int x;
scanf("%d", &x);
if (size >= 8) {
continue; // 队满保护
}
q[rear] = x;
rear = (rear + 1) % 8;
size++;
} else if (op == 0) {
// 出队操作(先进先出 FIFO)
if (size == 0) {
printf("empty\n");
} else {
printf("%d\n", q[front]);
front = (front + 1) % 8;
size--;
}
}
}
return 0;
}运行示例
输入:
1 10
1 20
0
0
-1输出:
10
20