给定一个初始为空的队(队存储空间长度为10)和一系列进队、出队操作,请编写程序输出经过这些操作后队中的元素。队中元素值均为整数。(采用循环队列完成,禁用一个空间方法)
时间: 2023-06-01 13:02:00 浏览: 94
循环队列是一种环形的数据结构,可以使用数组来实现。在队列的头尾都有指针,队头指针指向队列中第一个元素,队尾指针指向队列中最后一个元素的下一个位置。当队列中没有元素时,队头和队尾指针都指向同一个位置。
以下是使用循环队列实现进队、出队操作的代码:
```
#include <stdio.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int front; // 队头指针
int rear; // 队尾指针
} Queue;
void init(Queue *q) {
q->front = 0;
q->rear = 0;
}
int is_empty(Queue *q) {
return q->front == q->rear;
}
int is_full(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
void enqueue(Queue *q, int x) {
if (is_full(q)) {
printf("Queue is full.\n");
return;
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MAX_SIZE;
}
int dequeue(Queue *q) {
if (is_empty(q)) {
printf("Queue is empty.\n");
return -1;
}
int x = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return x;
}
void print(Queue *q) {
int i;
printf("Queue: ");
for (i = q->front; i != q->rear; i = (i + 1) % MAX_SIZE) {
printf("%d ", q->data[i]);
}
printf("\n");
}
int main() {
Queue q;
init(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
print(&q); // 队列中元素为 1 2 3
dequeue(&q);
print(&q); // 队列中元素为 2 3
enqueue(&q, 4);
enqueue(&q, 5);
print(&q); // 队列中元素为 2 3 4 5
dequeue(&q);
dequeue(&q);
dequeue(&q);
print(&q); // 队列中元素为空
dequeue(&q); // 输出 "Queue is empty."
return 0;
}
```
在上面的代码中,我们使用 `init` 函数初始化队列的头尾指针,使用 `is_empty` 和 `is_full` 函数判断队列是否为空或已满,使用 `enqueue` 函数将元素入队,使用 `dequeue` 函数将元素出队,使用 `print` 函数输出队列中的元素。
在 `enqueue` 函数中,我们首先判断队列是否已满,如果已满则输出错误信息并返回,否则将元素插入到队尾,并将队尾指针后移一个位置,需要注意的是,当队尾指针到达数组的末尾时,需要将其回到数组的开头,这可以使用取模运算来实现。
在 `dequeue` 函数中,我们首先判断队列是否为空,如果为空则输出错误信息并返回 `-1`,否则将队头指针后移一个位置,并返回队头元素。
在 `print` 函数中,我们使用循环遍历队列中的元素,并输出它们的值。需要注意的是,由于队列是循环的,我们需要使用取模运算来实现循环遍历。
阅读全文