ITPub博客

首页 > IT职业 > IT图书 > C++环形队列类模板 = =#

C++环形队列类模板 = =#

IT图书 作者:xiezhaoye 时间:2021-09-09 09:00:14 0 删除 编辑

首先感谢 james_yuan 老师,C++一路跟着学过来!

环形队列类模板的实现如下(附带测试代码)

  • 环形队列类模板
#ifndef CIRCULARQUEUE_H_INCLUDED
#define CIRCULARQUEUE_H_INCLUDED
#include 
#include 

using namespace std;

/**
 *  环形队列类模板
 *
 */
template 
class CircularQueue{
public:
    CircularQueue(int capacity);
    virtual ~CircularQueue();
    //清队
    void clearQueue();
    //入队
    bool enQueue(T element);
    //出队
    bool deQueue(T &element);   //传入一个T的引用,方便接队头,而不是返回队头,这样函数返回布尔,调用完毕后,引用拿到队头
    //判空
    const bool isEmpty();
    //判满
    const bool isFull();
    //队长
    const int length();
    //列队
    void printQueue(void(*pFunc)(T));    //适配所有模板类的打印,传入一个对应类型的打印函数指针
private:
    //队列数组指针
    T *m_pQueue;
    //队列容量
    int m_iCapacity;
    //队头
    int m_iHead;
    //队尾
    int m_iTail;
    //队长
    int m_iLength;
};

template 
CircularQueue::CircularQueue(int capacity){
    m_iCapacity = capacity;
    clearQueue();
    if ((m_pQueue = new T[m_iCapacity]) == NULL) {
        throw string("Queue Initialization Failed!");
    }
}

template 
CircularQueue::~CircularQueue(){
    delete []m_pQueue;
    m_pQueue = NULL;
}

template 
void CircularQueue::clearQueue(){
    m_iHead = 0;
    m_iTail = 0;
    m_iLength = 0;
}

template 
bool CircularQueue::enQueue(T element){
    if (isFull()) {
        return false;
    }
    m_pQueue[m_iTail] = element;
    m_iLength++;
    m_iTail++;
    m_iTail = m_iTail % m_iCapacity;
    return true;
}

template 
bool CircularQueue::deQueue(T &element){
    if (isEmpty()) {
        return false;
    }
    //传入一个T的引用,方便接收队头,而不是返队头,这样函数返回布尔,调用完毕后,引用拿到队头
    element = m_pQueue[m_iHead];
    m_iLength--;
    m_iHead++;
    m_iHead = m_iHead % m_iCapacity;
    return true;
}

template 
const bool CircularQueue::isEmpty(){
    return m_iLength == 0 ? true : false;
}

template 
const bool CircularQueue::isFull(){
    return m_iCapacity == m_iLength ? true : false;
}

template 
const int CircularQueue::length(){
    return m_iLength;
}

template 
void CircularQueue::printQueue(void(*pFunc)(T)){
    for (int i = m_iHead; i 
  • Coordinate测试类
#ifndef COORDINATE_H_INCLUDED
#define COORDINATE_H_INCLUDED

class Coordinate{
public:
    Coordinate();
    Coordinate(double x, double y);
    virtual ~Coordinate();
    double getX();
    double getY();
private:
    double m_iX;
    double m_iY;
};

Coordinate::Coordinate(){

}

Coordinate::Coordinate(double x, double y){
    m_iX = x;
    m_iY = y;
}

Coordinate::~Coordinate(){

}

double Coordinate::getX(){
    return m_iX;
}

double Coordinate::getY(){
    return m_iY;
}

#endif // COORDINATE_H_INCLUDED
  • 环形队列类模板测试
#include 
#include 
#include "CircularQueue.h"
#include "Coordinate.h"

using namespace std;

//打印整型数据,作为函数指针传递给队列类
void printInt(int o){
    cout  cQueueInt = CircularQueue(3);
        cQueueInt.enQueue(10);
        cQueueInt.enQueue(20);
        cQueueInt.enQueue(30);
        cQueueInt.printQueue(&printInt);
        cout  cQueueCoor = CircularQueue(3);
        Coordinate c1 = Coordinate(1,2);
        Coordinate c2 = Coordinate(3,4);
        Coordinate c3 = Coordinate(5,6);
        cQueueCoor.enQueue(c1);
        cQueueCoor.enQueue(c2);
        cQueueCoor.enQueue(c3);
        cQueueCoor.printQueue(&printCoor);
        cout 
  • 运行结果
    图片描述

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2956/viewspace-2807612/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-13

  • 博文量
    75
  • 访问量
    857