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

来源:互联网 发布:星图软件 编辑:程序博客网 时间:2024/05/22 04:46

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  isData        元素组成的表Operations        Constructor        Psize              //  返回队列中元素的个数        Pempty          //  检测队列是否为空,空返回True,否则False        Pappend        //  元素入队列,元素个数加1        Pserve           //  优先级最高的元素出队列,元素个数减1        Pclear            //  清空队列,并恢复到初始状态        Pfull              //  检测队列是否为满,满返回True,否则Falseend 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++语言描述专题系列 (十四) 波兰表达式

0 0
原创粉丝点击