13-数据结构_队列

来源:互联网 发布:kindle for mac 下载 编辑:程序博客网 时间:2024/05/23 18:30
线性结构的两种常见应用之一 队列

一, 定义

    一种可以实现"先进先出"的存储结构.
    两端操作, 一端只能入, 另一端只能出
    补充:
        front   : 队首
        rear    : 队尾
        入队    : 队尾操作
        出队    : 队首操作  

二, 分类

    1, 链式队列[链表]

        如图





    2, 静态队列[数组]

        静态队列通常都必须是循环队列


三, 循环队列

1, 问题

    1) 静态队列为什么必须是循环队列
    2) 循环队列需要几个参数来确定
    3) 循环队列各个参数的含义
    4) 循环队列入队伪算法
    5) 循环队列出队伪算法
    6) 如何判断循环队列是否为空
    7) 如何判断循环队列是否已满

2, 解

   (1) 静态队列为什么必须是循环队列

        如图, 出队/入队

        如果不是循环队列, 出队/入队都上移, 则下面的空间浪费了.



   (2) 循环队列需要几个参数来确定

        两个: front, rear

   (3) 循环队列各个参数的含义

        这两个参数不同场合有不同的含义
        1) 队列初始化
           front 和 rear 的值都是 零     
        2) 队列非空
           front : 队列的第一个元素
           rear  : 队列的最后一个有效元素的下一个元素
        3) 队列空
           front 和 rear 相等, 但不一定是零

   (4) 循环队列入队伪算法

        1) 将值存入rear指向的元素
        2) rear移向下一个元素, rear = (rear + 1) % arrLen

   (5) 循环队列出队伪算法

        front = (front + 1) % arrLen

   (6) 如何判断循环队列是否为空

        空: front == rear


   (7) 如何判断循环队列是否已满        

       两种方式:
       1) 多增加一个标志位参数, 1-满, 0-未满
       2) 少使用一个元素, 
          则, 满: (rear + 1) % arrLen == front 
       说明: 
          如果全部元素都使用, 则满和空时, front和rear都相等
          少使用一个元素, 当队列很大时, 可以忽略不计


四, 算法

1, 入队

2, 出队

五, 应用

    所有与时间有关操作 都有 队列的影子
    如
        操作系统中 阻塞队列, 执行队列,  ...