c语言如果允许在循环队列的两端都可以进行插入和删除操作。要求: ① 写出循环队列的类型定义; ② 写出“从队尾删除”和“从队头插入”的算法。
时间: 2024-12-15 14:16:21 浏览: 8
在C语言中,实现一个两端都能进行插入和删除操作的循环队列,我们可以定义一个结构体来存储元素,并维护两个指针,一个用于指示队头,另一个用于指示队尾。为了实现循环性质,当一个指针超过数组长度的一半时,我们将它移动回对端。以下是相应的类型定义、插入和删除操作的算法:
**类型定义(循环队列的结构体):**
```c
typedef struct {
int *queue; // 存储数据的动态数组
int capacity; // 队列容量
int front; // 队头指针
int rear; // 队尾指针
} Queue;
```
**创建循环队列的初始化函数(enqueue_init):**
```c
void enqueue_init(Queue *q, int size) {
q->queue = (int*)malloc(size * sizeof(int));
if (q->queue == NULL) {
printf("Memory allocation failed.\n");
return;
}
q->capacity = size;
q->front = -1;
q->rear = -1;
}
```
**从队尾删除(dequeue_rear)的算法:**
```c
void dequeue_rear(Queue *q) {
if (q->rear == -1 || q->front == q->rear) { // 空队列或只有一个元素
printf("Queue is empty.\n");
return;
}
if ((q->rear + 1) % q->capacity == q->front) { // 队尾接近队头,形成环形
q->front = (q->front + 1) % q->capacity;
} else {
q->rear = (q->rear + 1) % q->capacity; // 正常情况
}
}
```
**从队头插入(enqueue_front)的算法:**
```c
void enqueue_front(Queue *q, int data) {
if (q->rear == q->capacity - 1) { // 队列满
printf("Queue is full.\n");
return;
}
if (q->front == -1) { // 队列为空
q->front = 0;
} else if ((q->front + 1) % q->capacity == q->rear) { // 队尾接近队头,形成环形
q->front = (q->front + 1) % q->capacity;
}
q->queue[q->rear] = data;
q->rear = (q->rear + 1) % q->capacity;
}
```
阅读全文