• 常见基本数据结构——队列


    队列ADT

    像栈一样,队列也是一种表。然而使用队列时插入在一端进行而删除在另一端进行。

     队列模型

    队列的基本操作是Enquene(入队),它在表的末端插入一个元素,还有Dequene(出队),它是删除在表的开头的元素。

    队列的数组形式

    如同栈的形式一样,对于队列而言任何表的实现都是合法的。就像栈一样,对于每一种操作,链表实现和数组实现都给出快速的O(1)运行时间。

    对于队列数据结构,我们保留一个数组Quene[]以及位置Front和Rear,它们代表队列的两端。我们还要记录实际存在于队列中的元素的个数size。所有这些信息是作为一个结构的一部分,除队列例程本身外通常不会有例程直接访问它们。

    当一个元素X入队时,我们让Size和Rear增加1,然后至Quene[Rear]=X。若使一个元素出队,我们置返回值为Quene[Front],然后Size减1,然后使Front增加1。

    一个存在的问题是,当入队了较多元素时,Rear会到达数组的末端,下一个位置可能是不存在的,但是数组中的空间可能有较多剩余。

    简单的解决办法是,只要Front和Rear到达数组的尾端,它就又绕回开头。这叫做循环数组实现。

    实现回绕所需要附加的代码是极小的(虽然它可能使得运行时间加倍)。如果Front或者Rear增加1使得超越了数组,那么其值就要重置为数组的第一个位置。

    关于队列的循环实现,有两件事情要警惕,第一:检测队列是否为空;第二,存在多种表示队头和队尾的操作。例:不使用单元来表示队列的大小,而是依靠基准情况,当队列为空时Rear=Front-1。队列的大小通过比较Rear和Front来实现的。如果数组的大小为ASize时,当有ASize-1个元素时就表示队列满了。

     

    队列的声明

    struct QueueRecord;
    typedef struct QueueRecord *Queue;
    
    struct QueueRecord{
      int Capacity;
      int Front;
      int Rear;
      int Size;
      ElementType *Array;
    }

    测试队列是否为空

    void
    IsEmpty(Queue Q){
      return Q->Size == 0;
    }

    构造空队列的例程

    void
    MakeEmpty(Queue Q){
      Q->Size = 0;
      Q->Front = 1;
      Q->Rear = 0;
    }

    入队的例程

    static int
    Succ(int Value, Queue Q){
      if(++Value == Q->Captity){
        Value = 0;
      }
      return Value;
    }
    

    void Enqueue(ElementType X, Queue Q){   if(IsFull(Q))     Error();   else{     Q->size++;     Q->Rear = Succ(Q->Rear, Q);     Q->Array[Q->Rear] = X;   } }
  • 相关阅读:
    Java String字符串补0或空格
    oracle查看当前用户权限
    plsql developer 导出导入存储过程和函数
    扩展jQuery easyui datagrid增加动态改变列编辑的类型
    jQueryEasyUI Messager基本使用
    combox源码解析
    Solr -- Solr Facet 2
    Solr -- Solr Facet 1
    nginx -- 安装配置Nginx
    DOS
  • 原文地址:https://www.cnblogs.com/baby-lily/p/12199080.html
Copyright © 2020-2023  润新知