请用c语言实现并写出代码: 试编写在循环队列中“从队尾删除的算法。
时间: 2023-05-29 20:04:51 浏览: 101
循环队列是一种线性数据结构,可以用数组或链表实现。在循环队列中,从队尾删除元素的算法需要考虑以下几个步骤:
1. 判断队列是否为空,如果为空则无法删除元素,返回错误信息。
2. 将队尾元素删除,即将队尾指针向前移动一位。
3. 更新队列的长度,即将元素数量减一。
4. 如果队列的长度变为了零,则需要将队头指针和队尾指针指向同一个位置。
下面是使用数组实现循环队列的代码实现:
```c
#include <stdio.h>
#define MAX_SIZE 100 // 定义循环队列的最大容量
typedef struct {
int data[MAX_SIZE];
int front; // 队头指针
int rear; // 队尾指针
int length; // 队列长度
} Queue;
// 初始化循环队列
void initQueue(Queue *q) {
q->front = 0;
q->rear = 0;
q->length = 0;
}
// 判断循环队列是否为空
int isEmpty(Queue *q) {
return q->length == 0;
}
// 判断循环队列是否已满
int isFull(Queue *q) {
return q->length == MAX_SIZE;
}
// 入队操作
int enqueue(Queue *q, int value) {
if (isFull(q)) {
return 0; // 入队失败,队列已满
}
q->data[q->rear] = value;
q->rear = (q->rear + 1) % MAX_SIZE; // 计算下一个队尾指针的位置
q->length++;
return 1; // 入队成功
}
// 出队操作
int dequeue(Queue *q) {
if (isEmpty(q)) {
return -1; // 出队失败,队列为空
}
int value = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE; // 计算下一个队头指针的位置
q->length--;
if (q->length == 0) {
q->front = q->rear = 0; // 队列为空时,队头指针和队尾指针指向同一个位置
}
return value; // 出队成功
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
printf("%d\n", dequeue(&q)); // 输出1
printf("%d\n", dequeue(&q)); // 输出2
printf("%d\n", dequeue(&q)); // 输出3
printf("%d\n", dequeue(&q)); // 输出-1,队列已空
return 0;
}
```
阅读全文