数据结构:队列

1. 队列的定义

队列是一种先进先出(FIFO, First-In-First-Out)的线性数据结构,操作受限:

  • 队尾(Rear):插入元素(入队,Enqueue)。

  • 队头(Front):删除元素(出队,Dequeue)。


2. 队列的基本操作

操作描述时间复杂度
Enqueue(x)元素 x 入队尾O(1)
Dequeue()移除并返回队头元素O(1)
Front()查看队头元素(不删除)O(1)
IsEmpty()判断队列是否为空O(1)

3. 队列的实现方式

(1) 数组实现(循环队列)
  • 固定大小数组:通过模运算 (%) 实现循环利用空间。

  • 关键变量

    • front:指向队头。

    • rear:指向下一个插入位置。

    • 判满条件:(rear + 1) % size == front

  • 示例代码

    c

    #define MAX_SIZE 100
    typedef struct {
        int data[MAX_SIZE];
        int front, rear;
    } CircularQueue;
    
    void Enqueue(CircularQueue* q, int x) {
        if ((q->rear + 1) % MAX_SIZE == q->front) return; // 队满
        q->data[q->rear] = x;
        q->rear = (q->rear + 1) % MAX_SIZE;
    }
(2) 链表实现
  • 动态扩容:无需预先分配固定空间。

  • 示例代码

    c

    typedef struct Node {
        int val;
        struct Node* next;
    } Node;
    
    typedef struct {
        Node *front, *rear;
    } LinkedQueue;
    
    void Enqueue(LinkedQueue* q, int x) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->val = x;
        newNode->next = NULL;
        if (q->rear == NULL) {
            q->front = q->rear = newNode;
        } else {
            q->rear->next = newNode;
            q->rear = newNode;
        }
    }

4. 队列的应用场景

  • 广度优先搜索(BFS):树的层序遍历、图的最短路径。

  • 任务调度:CPU任务队列、打印机任务队列。

  • 消息队列:异步通信(如RabbitMQ、Kafka)。

  • 缓冲区管理:数据流处理(如网络包缓冲)。


5. 特殊队列类型

类型特点应用场景
双端队列(Deque)允许两端插入和删除(结合栈和队列特性)滑动窗口最大值、撤销操作
优先队列(Priority Queue)元素按优先级出队(通常用堆实现)任务调度、Dijkstra算法
循环队列数组空间循环利用,解决假溢出问题资源池管理

6. 队列 vs 堆(Heap)

特性队列(Queue)堆(Heap)
顺序规则先进先出(FIFO)按优先级(堆顶极值)
操作复杂度入队/出队:O(1)插入/删除:O(log n)
实现数组/链表完全二叉树(数组存储)
典型应用BFS、缓冲管理排序、Top-K问题、优先队列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值