实现队列的基本运算,初始化一个队列,完成数据元素入队、出队、读取队头元素等操作
时间: 2024-11-15 14:20:05 浏览: 33
在C语言中,我们可以使用数组或链表来实现队列的基本运算。这里我们介绍两种常见的实现方式:
**1. 数组实现(先进先出,FIFO)**
```c
#include <stdio.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE];
int front; // 队首指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void initialize(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 入队(数据元素添加到队尾)
void enqueue(Queue *q, int item) {
if ((q->rear + 1) % MAX_SIZE == q->front) { // 队满处理
printf("Queue is full.\n");
return;
}
q->rear = (q->rear + 1) % MAX_SIZE; // 循环数组,后进先出
q->data[q->rear] = item;
if (q->front == -1) q->front = 0; // 队首为空时更新
}
// 出队(删除并返回队首元素)
int dequeue(Queue *q) {
if (q-1) { // 队空处理
printf("Queue is empty.\n");
return -1;
}
int item = q->data[q->front]; // 取队首元素
q->data[q->front] = -1; // 标记已删除
if (q->front == q->rear) q->front = q->rear = -1; // 清空队列
else q->front = (q->front + 1) % MAX_SIZE; // 更新队首
return item;
}
// 读取队头元素但不移除(队列头部检查)
int peek(Queue *q) {
if (q->front == -1) return -1; // 队空处理
return q->data[q->front];
}
```
**2. 链表实现(动态大小,FIFO)**
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct Queue {
Node* front;
Node* rear;
} Queue;
// 初始化队列
void initialize(Queue *q) {
q->front = q->rear = NULL;
}
// 动态分配节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 入队(数据元素添加到队尾)
void enqueue(Queue *q, int item) {
Node* newNode = createNode(item);
if (q->rear == NULL) {
q->front = q->rear = newNode;
} else {
newNode->next = q->rear;
q->rear = newNode;
}
}
// 出队(删除并返回队首元素)
int dequeue(Queue *q) {
if (q->front == NULL) { // 队空处理
printf("Queue is empty.\n");
return -1;
}
int item = q->front->data;
Node* temp = q->front;
q->front = q->front->next;
free(temp); // 释放内存
if (q->front == NULL) q->rear = NULL; // 队列清空
return item;
}
// 读取队头元素但不移除
int peek(Queue *q) {
if (q->front == NULL) return -1; // 队空处理
return q->front->data;
}
```
阅读全文