队列

作者: Vergil_wj | 来源:发表于2021-07-29 08:37 被阅读0次

一种可以实现“先进先出”的存储结构。

分类:

  • 链式队列:用链表实现;
  • 静态队列:用数组实现,通常都是循环队列。
循环队列:
  1. 静态队列为什么是循环队列?
    避免内存浪费。

  2. 循环队列需要几个参数来确定?
    2个参数:front 与 rear。

  3. 循环队列各个参数含义。
    不同场合有不同含义:
    1、队列初始化:front 与 rear 的值都是 0。
    2、队列非空:font 代表队列第一个元素,rear 代表队列最后一个有效元素的下一个元素。
    3、队列空:front` 与 rear 值相等,但不一定是 0 。

  4. 循环队列入队伪算法讲解。
    1、将值存入 rear 所代表的位置。
    2、r 指向下一位。错误写法 rear = rear+1,正确写法:rear =( rear+1)%(数组长度)

  5. 循环队列出队伪算法讲解。
    同入队,front = (front+1)%数组长度

  6. 如何判断循环队列是否为空。
    rear 的值与 front 的值相同时,队列为空。

  7. 如何判断循环队列是否已满。
    front 可能比 rear 大,也可能比 rear 小,也可能相等。
    两种方式判断:
    1、多增加一个标识参数,标识数组长度。
    2、少用一个元素(通常使用第二种方式)。例如队列长度为6,可以使用 6 个元素,但让其只使用 5 个元素。

if((r+1)%数组长度 == f){
  已满
}else{
  不满
}
队列实现
#include <stdio.h>
#include <malloc.h>

typedef struct Queue
{
    int *pBase;
    int front;
    int rear;
} QUEUE;

void init(QUEUE *);
bool en_queue(QUEUE *, int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_quere(QUEUE *, int *pVal);

int main(void)
{
    QUEUE Q;
    int val;

    init(&Q);
    en_queue(&Q, 1);
    en_queue(&Q, 2);
    en_queue(&Q, 3);
    en_queue(&Q, 4);
    en_queue(&Q, 5);
    en_queue(&Q, 6);

    traverse_queue(&Q);

    if (out_quere(&Q, &val))
    {
        printf("出队成功,出队元素是 %d\n", val);
    }
    else
    {
        printf("出队失败!\n");
    }

    return 0;
}

// 初始化
void init(QUEUE *pQ)
{
    //pBase 指向了 24 个字节的数组.
    pQ->pBase = (int *)malloc(sizeof(int) * 6);
    pQ->front = 0;
    pQ->rear = 0;
}

// 判断队列是否已满
bool full_queue(QUEUE *pQ)
{
    if ((pQ->rear + 1) % 6 = pQ->front)
        return true;
    else
        return false;
}

// 入队
bool en_queue(QUEUE *pQ, int val)
{
    if (full_queue(pQ))
    {
        return false;
    }
    else
    {
        pQ->pBase[pQ->rear] = val;
        pQ->rear = (pQ->rear + 1) % 6;
        return true;
    }
}

// 遍历
void traverse_queue(QUEUE *pQ)
{
    int i = pQ->front;
    while (i != pQ->rear)
    {
        printf("%d ", pQ->pBase[i]);
        i = (i + 1) % 6
    }
    return;
}

// 判断队列是否为空

bool empty_queue(QUEUE *pQ)
{
    if (pQ->front == pQ->rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}

// 出队
bool out_quere(QUEUE *pQ, int *pVal)
{
    if (empty_queue(pQ))
    {
        return false
    }
    else
    {
        *pVal = pQ->pBase[pQ->front];
        pQ->front = (pQ->front + 1) % 6;
        return true
    }
}
队列应用

所有和时间有关的操作都与队列的影子。

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

    本文标题:队列

    本文链接:https://www.haomeiwen.com/subject/yandmltx.html