数据结构:队列的顺序存储实现
队列是一种先进先出(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(牺牲一个存储单元来区分队空和队满)
指针移动:入队和出队操作后,指针都要进行取模运算