欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用c++基于模板实现的可设置容量的队列(Queue)

程序员文章站 2022-07-14 14:19:20
...

环境介绍

  • c++14标准,clion+mingw编译成功,vs2008下面编译也成功

队列及实现介绍

  • 先进先出的特性
  • 实现时基于数组的,可以构造时传入队列容量
  • 由于基于模板编程,队列可以存储多种数据类型,便于扩展
  • 实现了基本操作:尾部插入、头部删除、遍历

源代码

  • 代码在vs2008上也可以直接运行
#include <iostream>

template <class T> class Queue
{
public:
    Queue(int);
    ~Queue();
    bool Insert(T);
    T Delete();
    void Destroy();
    void Traverse();

private:
    int max_size;
    int front;
    int rear;
    T* arry;
};

template <class T> Queue<T>::Queue(int size) {
    front = -1;
    rear = -1;
    if(size<=0)
        return;
    arry = new T[size];
    max_size = size;
}

template <class T>  Queue<T>::~Queue() {
    delete []arry;
}

template <class T> bool Queue<T>::Insert(T t) {
    if(front == -1)//去除size为1的bug,队列容量为1时,实际上可以插入,但是由于qCount计算为1,等于最大容量,导致不能插入的bug
    {
        front++;
        arry[++rear]=t;
        return true;
    }
    int qCount = abs(rear-front)+1;
    if(qCount==max_size)//先判满
    {
        std::cout<<"queue is full!"<<std::endl;
        return false;
    }
    rear = (rear+1)%max_size;
    arry[rear] = t;
    if(front == -1)
        front++;
    return true;


}

template <class T> T Queue<T>::Delete() {

    int qCount = abs(rear-front)+1;
    if(rear == front && qCount != max_size)//队中只有一个元素,直接变空队列
    {
        T tmp = arry[front];
        front = -1;
        rear = -1;
        return tmp;
    }
    front = (front+1)%max_size;//不止一个元素
    return arry[front];

}

template <class T> void Queue<T>::Destroy() {
    delete []arry;
}
template <class T> void Queue<T>::Traverse() {
    if(front == -1)
    {
        std::cout<<"queue is empty!"<<std::endl;
        return;
    }

    int f = front;
    int r = rear;
    while(f != r)
    {
        std::cout<<arry[(f++)%max_size]<<std::endl;
    }
    std::cout<<arry[f]<<std::endl;
}
int main() {
    Queue<int> q(3);
    q.Insert(1);
    q.Insert(2);
    q.Insert(3);
    q.Traverse();

    q.Delete();
    q.Delete();
    q.Delete();
    q.Traverse();
    system("pause");
    return 0;
}