数据结构:队列的顺序存储实现

发布于:2025-07-05 ⋅ 阅读:(18) ⋅ 点赞:(0)

队列是一种先进先出(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(牺牲一个存储单元来区分队空和队满)

指针移动:入队和出队操作后,指针都要进行取模运算