[C++] 习题 2.15 实现简单环形队列

设计一个环形队列,用front和rear分别作为队头和队尾指针,另外用一个tag表示队列是空 ( 0 ) 还是不空 ( 1 ),这样就可以用front==rear作为队满的条件。要求设计队列的相关基本运算算法。

前置技能

  • 环形队列
    队列中进出时需要大量前移后移操作,除了链式队列,使用环形队列挪动下标也是一个不错的选择。队列的数据类型定义参考书第45页。
环形队列

具体实现

原理很简单,实现的时候要注意判断tag在数入队、出队时,是否要转换真假值。另外清除队列时只需要把头尾相对,队列标空。

#include

template
class queue{
    private:
        int maxsize;
        int front;
        int rear;
        bool tag;
        T *data;
    public:
        queue(int size){
            maxsize = size;
            front = 0;
            rear = 0;
            tag = false;
            data = new T [size];
        }
        ~queue(){
            delete data;
        }
        void clear(){            //清除
            rear = front;
            tag = false;
        }
        bool enqueue (T tmp){    //入队
            if(full()){
                return false;
            }
            else{
                if(empty()){
                    tag = true;
                }
                data[rear] = tmp;
                rear = (rear+1) % maxsize;
                return true;
            }
        }
        bool dequeue (T &tmp){   //出队
            if(empty()){
                return false;
            }
            else{
                tmp = data[front];
                front = (front+1) % maxsize;
                if(front == rear){
                    tag = false;
                }
                return true;
            }
        }
        bool getfront (T &tmp){
            if(empty()){
                return false;
            }
            else {
                tmp = data[front];
                return true;
            }
        }
        bool empty(){
            if (rear == front && tag == false){
                return true;
            }
            else{
                return false;
            }
        }
        bool full(){
            if (rear == front && tag == true){
                return true;
            }
            else{
                return false;
            }
        }
};

你可能感兴趣的:([C++] 习题 2.15 实现简单环形队列)