C++ 实现队列

63 阅读2分钟

什么是队列

队列也是一种操作受限的线性表,它与栈不同,它只允许在表的一端进行插入,在表的另一端进行删除。向队列中插入元素称为入队或者进队;删除元素称为出队或离队。这和我们日常生活中的排队是一致的。

  1. 队头: 允许删除的一端,又称队首。
  2. 队尾: 允许插入的一端。
  3. 空队列: 不含任何元素的空表。

队列的性质

队列的特性是先进先出。

类结构

队列也可以对之前的顺序表进行封装。若直接实现顺序队列可以较好的利用之前的顺序表。但顺序队列会存在“假溢出”问题,所谓假溢出就是队尾指针指向了线性表的最后一个单元的下一个单元,但队头并不在第一个单元,所以在线性表的头部其实还有空间,但无法插入了。

由于顺序队列有假溢出问题,所以此处实现的为循环队列。
所谓循环队列就是每次对队首指针和队尾指针进行+1操作时需要进行取余运算,使得他们指向最后一个单元时再+1可以回到0位置。由于之前实现的顺序表的位置序号是[1,n]对其实现循环队列不方便,故使用了数组进行实现。

template<typename T>
class CQueue {
private:
    T* data;
    int front,rear;
    int capacity;
public:
    CQueue();

    CQueue(int capacity);

    virtual ~CQueue();

    //判断是否队空
    bool isEmpty();
    //判断是否队满
    bool isFull();
    // 入队
    bool EnQueue(T e);
    //出队
    bool DeQueue(T &e);

};

支持的一些方法

template<typename T>
CQueue<T>::CQueue() {
    front = 0;
    rear = 0;
    data = new T[MaxSize];
    capacity = MaxSize;
}

template<typename T>
CQueue<T>::CQueue(int capacity) {
    front = 0;
    rear = 0;
    data = new T[capacity];
    this->capacity = capacity;
}

template<typename T>
CQueue<T>::~CQueue() {
    delete[] data;
}

template<typename T>
bool CQueue<T>::isEmpty() {
    if(front==rear){
        return true;
    }
    return false;
}

template<typename T>
bool CQueue<T>::isFull() {
    if((rear+1)%capacity==front){
        return true;
    }
    return false;
}

template<typename T>
bool CQueue<T>::EnQueue(T e) {
    if(this->isFull()) return false;
    data[rear] = e;
    rear = (rear+1)%capacity;
    return true;
}

template<typename T>
bool CQueue<T>::DeQueue(T &e) {
    if(front==rear) return false;
    e = data[front];
    front=(front+1)%capacity;
    return true;
}

总结

队列在计算机领域同样有着广泛的应用, 例如在TCP协议中要使用到的滑动窗口算法就需要使用到队列。