设计一个循环队列,具有插入元素、删除元素、显示及取值等功能。
时间: 2024-10-25 22:15:05 浏览: 18
要设计一个循环队列,我们需要考虑以下几点:
1. **数据结构**: 队列通常使用数组或链表实现。由于循环队列的特点(队尾指针指向开始位置时会发生溢出),我们选择数组更合适。
2. **两个指针**:
- `front`: 当前队首元素的位置,初始化为0。
- `rear`: 当前队尾元素的下一个位置,初始化为数组长度减一。
3. **队满**: 当`rear`等于`front + (size - 1)`(模数组长度)时,表示队列已满。
4. **队空**: 当`front == rear`时,表示队列为空。
下面是基本的C语言实现:
```c
#include <stdio.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = queue->rear = -1;
}
// 插入元素到队尾
void enqueue(Queue *queue, int value) {
if ((queue->rear + 1) % MAX_SIZE == queue->front) { // 队满
printf("Queue is full.\n");
return;
}
queue->rear = (queue->rear + 1) % MAX_SIZE; // 循环更新队尾
queue->data[queue->rear] = value;
if (queue->front == -1) queue->front = 0; // 如果队列为空,front更新为0
}
// 删除队首元素
int dequeue(Queue *queue) {
if (queue->front == queue->rear) { // 队空
printf("Queue is empty.\n");
return -1;
}
int value = queue->data[queue->front]; // 获取队首元素
queue->front = (queue->front + 1) % MAX_SIZE; // 更新队首
return value;
}
// 显示队列
void displayQueue(Queue *queue) {
if (queue->front == queue->rear) {
printf("Queue is empty.\n");
} else {
for (int i = queue->front; i != queue->rear; i = (i + 1) % MAX_SIZE) {
printf("%d ", queue->data[i]);
}
printf("%d\n", queue->data[queue->rear]); // 如果不是最后一个元素,打印队尾
}
}
int main() {
Queue q;
initQueue(&q);
// 示例操作
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
displayQueue(&q); // 输出: 1 2 3
printf("%d\n", dequeue(&q)); // 输出: 1
displayQueue(&q); // 输出: 2 3
return 0;
}
```
阅读全文