数据结构C++语言描述专题系列 (三) 队列

1、队列及其实现

队列的定义:在表的一端(rear)进行输入,在另一端(front)进行输出操作的表。
队列的特点:先进先出(FIFO)。

  • 队列的抽象数据类型
ADT  Queue  is
  Data
        数据项列表
        front:队列中第一个数据项的位置
        rear: 队列中最后一个数据项的位置
        count:队列中元素的个数
  Operations
        Constructor        // 初始化队头和队尾
        append               // 入队列
        serve                  // 出队列
        retrieve              // 返回队列头部的元素的值
        empty                // 检测队列是否为空
end  ADT  Queue
  • 类队列的声明与实现
类Queue的定义
class Queue
{
   protected:
       int front, rear, count;
       Queue_entry entry[maxqueue];
   public:
       Queue( ); 
       bool empty( ) const;
       Error_code append(const Queue_entry &x);
       Error_code serve( );
       Error_code retrieve(Queue_entry &x)  const;       
 }
  • 派生类队列

队列中还有一些重要的方法如队列中的元素个数、清空队列、队列满测试等等。
采用C+ + 的派生类方法加以解决。

class Extended_queue: public Queue
{
    public:
       bool full( ) const;             // 测试派生类队列是否满
       int size( ) const;               // 返回派生类队列中元素个数
       void clear( );                    //  清空派生类队列
       Error_code serve_and_retrieve(Queue_entry &x);     //  返回派生 
                                                  类队列的头元素并修改队列头的位置
};
  • 顺序队列的操作示意

在队列中有三个元素A、B、C
这里写图片描述

2、循环队列

指针移动用求余运算达到“循环”的目的。
这里写图片描述

  • 循环队列的实现
Queue的构造函数
   Queue∷Queue( )
 /* Post: The Queue is initialized to be empty.  */   
 {
       count = 0;
       rear = maxqueue – 1
       front = 0
 }

函数空的测试
Bool Queue ∷empty( ) const
/* Post: Return true if the Queue is empty, otherwise return false. */
{
    return count = = 0;

入队列操作首先要判断队列是否满?(用记数判断队列满)
Error_code  Queue ∷append(const Queue_entry &item)
/* Post: item is added to the rear of the Queue. If the Queue is full return an Error_code of overflow and leave the Queue unchanged. */
{
   if (count > = maxqueue) return overflow;         // 判断队列是否满
   count + +;
   rear = (rear+1) % maxqueue;  // 修改队尾指针
   entry[rear] = item;          // 在队尾插入数据项
   return success;
 }

出队列操作
Error_code Queue∷serve( )
/* Post: The front of the Queue is removed. If the Queue is empty return an Error_code of underflow. */
{
   if (count< = 0)  return downflow;     // 判断队列是否为空
   count - -;
   front = (front+1) % maxqueue;         // 修改队头指针
   return  success;
}
检索队列头元素
Error_code Queue ∷retrieve ( Queue_entry &item) const
/* Post: The front of the Queue retrieved to the output parameter item. If the Queue is empty return an Error_code of underflow. */
{
   if (count< = 0)  return downflow;                 // 判断队列是否为空
   item = entry[front]; 
   return  success;
}

3、优先级队列

与一般队列的区别 :出队列不是按入队列的先后次序,而是按数
据项本身的优先级,优先级高的先出队列。
这里写图片描述
count有多重作用:计数器,队尾指针
假定优先级最高的元素是值最小的元素,如
按优先级从高到低,上述任务次序为:
任务#2、任务#5、任务#1、任务#4、任务#3。
若没有新的任务加入,执行的次序(出队列的次序)应为
首先任务#2,其次任务#5、任务#1、任务#4,最后任务#3。

  • 优先级队列的声明与实现
优先级队列的抽象数据类型
ADT  Priority Queue  is
Data
        元素组成的表
Operations
        Constructor
        Psize              //  返回队列中元素的个数
        Pempty          //  检测队列是否为空,空返回True,否则False
        Pappend        //  元素入队列,元素个数加1
        Pserve           //  优先级最高的元素出队列,元素个数减1
        Pclear            //  清空队列,并恢复到初始状态
        Pfull              //  检测队列是否为满,满返回True,否则False
end ADT Priority Queue


优先级队列的实现
PQueue 类的定义
class PQueue
{
   private:
      int  count;
      Queue_entry pentry[maxpqueue];
   public:
       //  构造函数
       Pqueue( );
       // 修改优先级队列的操作
       Error_code Pappend(const Queue_entry &item);
       Error_code Pserve( );
       Pclear( );
       // 检测优先级队列状态的操作
       bool Pempty( ) const;
       bool Pfull( ) const;
       bool Psize( ) const;
};

入队列操作

这里写图片描述

Error_code Pappend(const Queue_entry &item);
// 
PQueue ∷Pappend(const Queue_entry &item)
{
   if (count = = maxqueue)         //  队列满,退出
     {
           cerr<<“Priority queue overflow!”<<endl;
           exit(1);
      };
   pentry[count] = item;                  //  入队列,计数器加1
   count + +;
}

出队列操作

这里写图片描述

在队列非空的前提下,遍历队列以确定有最小值(即优先级最高)
的元素,删除之;并用队列尾元素代替这个元素(位置),最后一
个元素除外。

出优先级队列函数
Error_code Pqueue∷ Pserve( )                 
{                                             
   Queue_entry min;                           
   int i,  minindex = 0;                      
   if (count>0)                              
   {                                        
        //  在pqlist中寻找最小值及其下标       
        min = pentry[0];   //假设pentry[0]最小
        //  遍历队列,修改最小值及下标           
        for (i = 1;  i<count;  i + +)        
              if (pentry[i] <min)            
              {  
                    //  新的最小值及其下标     
                    min = pentry[i];          
                    minindex = i;             
              };                          
              //将尾元素移入最小元素处并将count减1                             
              pentry[minindex] = pentry[count-1];      
              count - -;                                 
              }                                                
              // 若pqlist为空,则退出                        
              else                                              
              {                                           
                   出错,退出                                      
              };                                           
         return min;                                 
   }                                    

持续更新中。。。

数据结构C++语言描述专题系列 (一) 绪论
数据结构C++语言描述专题系列 (二) 栈
数据结构C++语言描述专题系列 (三) 队列
数据结构C++语言描述专题系列 (四) 链式栈和队列
数据结构C++语言描述专题系列 (五) 递归
数据结构C++语言描述专题系列 (六) 表与串
数据结构C++语言描述专题系列 (七) 查找
数据结构C++语言描述专题系列 (八) 排序
数据结构C++语言描述专题系列 (九) 表与信息检索
数据结构C++语言描述专题系列 (十) 二叉树
数据结构C++语言描述专题系列 (十一) 多路数
数据结构C++语言描述专题系列 (十二) 集合及其表
数据结构C++语言描述专题系列 (十三) 图
数据结构C++语言描述专题系列 (十四) 波兰表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值