队列是一种先进先出(FIFO)的线性数据结构,顺序存储实现通常使用数组来存储元素。以下是队列的顺序存储实现代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100 // 队列的最大容量
typedef struct {
int data[MAX_SIZE];
int front; // 队头指针
int rear; // 队尾指针
} SeqQueue;
// 初始化队列
void InitQueue(SeqQueue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
bool IsEmpty(SeqQueue *q) {
return q->front == q->rear;
}
// 判断队列是否已满
bool IsFull(SeqQueue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队操作
bool EnQueue(SeqQueue *q, int value) {
if (IsFull(q)) {
printf("队列已满,无法入队\n");
return false;
}
q->data[q->rear] = value;
q->rear = (q->rear + 1) % MAX_SIZE; // 循环队列
return true;
}
// 出队操作
bool DeQueue(SeqQueue *q, int *value) {
if (IsEmpty(q)) {
printf("队列为空,无法出队\n");
return false;
}
*value = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE; // 循环队列
return true;
}
// 获取队头元素
bool GetHead(SeqQueue *q, int *value) {
if (IsEmpty(q)) {
printf("队列为空\n");
return false;
}
*value = q->data[q->front];
return true;
}
// 打印队列中的元素
void PrintQueue(SeqQueue *q) {
if (IsEmpty(q)) {
printf("队列为空\n");
return;
}
printf("队列元素: ");
int i = q->front;
while (i != q->rear) {
printf("%d ", q->data[i]);
i = (i + 1) % MAX_SIZE;
}
printf("\n");
}
int main() {
SeqQueue q;
InitQueue(&q);
// 测试入队
for (int i = 1; i <= 5; i++) {
EnQueue(&q, i * 10);
}
PrintQueue(&q);
// 测试出队
int value;
DeQueue(&q, &value);
printf("出队元素: %d\n", value);
PrintQueue(&q);
// 获取队头元素
GetHead(&q, &value);
printf("队头元素: %d\n", value);
return 0;
}
关键点说明:
循环队列:使用取模运算实现循环队列,解决"假溢出"问题
队空条件:front == rear
队满条件:(rear + 1) % MAX_SIZE == front(牺牲一个存储单元来区分队空和队满)
指针移动:入队和出队操作后,指针都要进行取模运算