【c++】环形队列类模板

    xiaoxiao2025-04-01  14

    在慕课网数据结构——队列篇的学习后,老师提出可以自己写个队列的模板,下面是我根据课中内容进行改写的类模板:

    此为头文件:

    #ifndef MYQUEUE_H #define MYQUEUE_H template<class T> class MyQueue { public: //C语言函数定义法 MyQueue(int queueCapacity); //InitQueue(&Q) 创建队列 virtual ~MyQueue(); //DestroyQueue(&Q) 销毁队列 void ClearQueue(); //ClearQueue(&Q) 清空队列 bool QueueEmpty() const; //QueueEmpty(Q) 判空队列 bool QueueFull() const; //QueueFull(Q) 判满队列 int QueueLength() const; //QueueLength(Q) 队列长度 bool EnQueue(T element); //EnQueue(&Q,element) 新元素入队 bool DeQueue(T &element); //DeQueue(&Q,&element) 首元素出队 void QueueTraverse(); //QueueTraverse(Q,visit()) 遍历队列 private: T *m_pQueue; //队列数组指针 int m_iQueueLen; //队列元素个数 int m_iQueueCapacity; //队列数组容量 int m_iHead; //队列头 int m_iTail; //队列尾 }; template<class T> MyQueue<T>::MyQueue(int queueCapacity) { m_iQueueCapacity = queueCapacity; m_pQueue = new T[m_iQueueCapacity]; ClearQueue(); } template<class T> MyQueue<T>::~MyQueue() { delete[]m_pQueue; m_pQueue = NULL; } template<class T> void MyQueue<T>::ClearQueue() { m_iHead = 0; m_iTail = 0; m_iQueueLen = 0; } template<class T> bool MyQueue<T>::QueueEmpty() const { if (m_iQueueLen == 0) { return true; } else { return false; } //return m_iQueueLen == 0 ? true : false; } template<class T> bool MyQueue<T>::QueueFull() const { if (m_iQueueLen == m_iQueueCapacity) { return true; } return false; } template<class T> int MyQueue<T>::QueueLength() const { return m_iQueueLen; } template<class T> bool MyQueue<T>::EnQueue(T element) { if (QueueFull()) { return false; } else { m_pQueue[m_iTail] = element; m_iTail++; m_iTail = m_iTail%m_iQueueCapacity; m_iQueueLen++; return true; } } template<class T> bool MyQueue<T>::DeQueue(T &element) { if (QueueEmpty()) { return false; } else { element = m_pQueue[m_iHead]; m_iHead++; m_iHead = m_iHead%m_iQueueCapacity; m_iQueueLen--; return true; } } template<class T> void MyQueue<T>::QueueTraverse() { cout << endl; for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++) { cout << m_pQueue[i%m_iQueueCapacity] << endl; cout << "前面还有" << (i - m_iHead) << "人" << endl; } cout << endl; } #endif 下面是测试的主函数:

    #include<iostream> #include<stdlib.h> #include"MyQueue.h" using namespace std; int main() { MyQueue<int> *p = new MyQueue<int>(4); p->EnQueue(10); p->EnQueue(12); p->EnQueue(16); p->EnQueue(18); p->EnQueue(20); p->QueueTraverse(); int e = 0; p->DeQueue(e); cout << endl; cout << e << endl; p->DeQueue(e); cout << endl; cout << e << endl; cout << endl; p->QueueTraverse(); p->ClearQueue(); p->QueueTraverse(); p->EnQueue(20); p->EnQueue(30); p->QueueTraverse(); delete p; p = NULL; system("pause"); return 0; }在测试的过程还出现了一个问题:当类模板的定义和声明分在.h和.cpp文件时,会报错,通过查找资料,才明白类模板的定义和声明应写在一个文件中,或者在demo.cpp添加include“MyQueue.cpp”语句

    相关资料链接:

    http://www.cppblog.com/sToa/archive/2009/07/25/91125.html

    转载请注明原文地址: https://ju.6miu.com/read-1297600.html
    最新回复(0)