算法笔记p251队列&循环队列

队列

  • 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。
  • 队列的常用操作包括获取队列内元素的个数(size)、判空(empty)、入队(push)、出队(pop)、取队首元素(get_front)、取队尾元素(get_rear)等。

循环队列

  • 循环队列允许队列的头尾相接,形成一个环。
  • 用数组实现循环队列,队头指针front指向队列第一个元素,队尾指针rear指向最后一个元素的下一个位置。
  • 由于是循环队列,因此队头指针和队尾指针每次移动都需要对数组长度取余,以确保移动到正确的位置上。
    • 后移:rear = (rear + 1)% MaxSize
    • 前移:rear = (rear + MaxSize - 1)% MaxSize

循环队列示例
如上图所示,MaxSize = 6,rear当前指向5的位置:

  • 后移:rear = (5 + 1)% 6 = 0
  • 前移:rear = (5 + 6 - 1)% 6 = 4

循环队列的定义

#include <stdbool.h>

#define MaxSize 1000

typedef int ElemType;

typedef struct Queue {
    ElemType data[MaxSize];
    int front, rear;
} Queue;

初始化

循环队列初始化时,front和rear都指向数组的第一个位置。

void init(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

判空

队尾指针rear和队头指针front指向同一个地方,即队列为空。

bool empty(Queue *q) {
    return q->front == q->rear;
}

判满

队尾指针的下一个位置指向的是队头指针,则队满。(空出一个元素)

bool full(Queue *q) {
    return (q->rear + 1) % MaxSize == q->front;
}

入队

入队先判满。
由于队尾指针指向队列最后一个元素的下一个位置,因此入队时,先把元素存放到rear指向的位置,然后再将rear + 1。

bool push(Queue *q, ElemType value) {
    if (full(q))
        return false;
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % MaxSize;
    return true;
}

出队

出队先判空
由于队头指针指向队列第一个元素,因此出队时,先记录front指向位置的元素,然后再将front + 1。

bool pop(Queue *q, ElemType *p) {
    if (empty(q))
        return false;
    *p = q->data[q->front];
    q->front = (q->front + 1) % MaxSize;
    return true;
}

获取队列内元素的个数

队列内元素的个数:(rear + MaxSize - front)% MaxSize

int size(Queue *q) {
    return (q->rear + MaxSize - q->front) % MaxSize;
}

取队首元素

取队首元素先判空。
将front指针所在位置的元素记录下来即可。

bool get_front(Queue *q, ElemType *value) {
    if (empty(q))
        return false;
    *value = q->data[q->front];
    return true;
}

取队尾元素

取队尾元素先判空。
将rear指针所在位置的前一个位置的元素记录下来即可。

bool get_rear(Queue *q, ElemType *value) {
    if (empty(q))
        return false;
    int pos = (q->rear + MaxSize - 1) % MaxSize;
    *value = q->data[pos];
    return true;
}

相关推荐

  1. 算法与数据结构 循环队列 (C++)

    2024-03-21 02:18:02       41 阅读
  2. 数据结构 / 队列 / 循环队列 / 入队列和出队列

    2024-03-21 02:18:02       64 阅读
  3. 设计循环队列

    2024-03-21 02:18:02       69 阅读
  4. golang实现循环队列

    2024-03-21 02:18:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 02:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 02:18:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 02:18:02       82 阅读
  4. Python语言-面向对象

    2024-03-21 02:18:02       91 阅读

热门阅读

  1. UBUNTU 命令

    2024-03-21 02:18:02       40 阅读
  2. LeetCode 面试经典150题 238.除自身以外数组的乘积

    2024-03-21 02:18:02       41 阅读
  3. css常用选择器用法和示例说明

    2024-03-21 02:18:02       45 阅读
  4. 面试宝典:MySQL 慢查询优化

    2024-03-21 02:18:02       43 阅读
  5. #微信小程序:微信小程序常见的配置&传旨

    2024-03-21 02:18:02       36 阅读
  6. 一种爬取网易云歌曲与歌词的方法

    2024-03-21 02:18:02       35 阅读
  7. Python 机器学习 HMM模型三种经典问题

    2024-03-21 02:18:02       45 阅读
  8. [leetcode 274][H指数]

    2024-03-21 02:18:02       42 阅读
  9. 【pip学习笔记】Python包管理器 - pip

    2024-03-21 02:18:02       36 阅读