参考:http://www.imooc.com/learn/519
队列机制:先进先出 FIFO(first in first out)
队列结构:普通队列&环形队列
环形队列的好处:解决了普通队列浪费内存的问题!
下面是我用模板类实现的一个环形队列:
#pragma once
#ifndef QUEUE_H
#define QUEUE_H
template<typename T>
class Queue {
private:
T *m_pQueue;//队列指针
int m_iQueueLen;//队列元素个数
int m_iQueueCapacity;//队列容量
int m_iHead;//队首位置
int m_iTail;//队尾位置
public:
Queue(int queueCapacity);//创建队列
virtual ~Queue();//销毁队列
void clearQueue();//清空队列
bool isEmpty();//判空
bool isFull();//判满
int getLength();//获取队列长度
bool enQueue(T element);//新元素入队
bool deQueue(T &element);//首元素出队
void traverseQueue();//遍历队列
T getHead();//访问队首元素
T getTail();//访问队尾元素
};
#endif QUEUE_H
template<typename T>
Queue<T>::Queue(int queueCapacity)
{
m_iQueueCapacity = queueCapacity;
m_iHead = 0;
m_iTail = 0;
m_iQueueLen = 0;
m_pQueue = new T[m_iQueueCapacity];
}
template<typename T>
Queue<T>::~Queue()
{
delete []m_pQueue;
m_pQueue = NULL;
}
template<typename T>
void Queue<T>::clearQueue()
{
m_iHead = 0;
m_iTail = 0;
m_iQueueLen = 0;
}
template<typename T>
bool Queue<T>::isEmpty()
{
return m_iQueueLen == 0 ? true : false;
}
template<typename T>
bool Queue<T>::isFull()
{
return m_iQueueLen == m_iQueueCapacity ? true : false;
}
template<typename T>
int Queue<T>::getLength()
{
return m_iQueueLen;
}
template<typename T>
bool Queue<T>::enQueue(T element)
{
if (isFull())
return false;
else {
m_pQueue[m_iTail] = element;
m_iTail++;
m_iQueueLen++;
m_iTail = m_iTail % m_iQueueCapacity;
return true;
}
}
template<typename T>
bool Queue<T>::deQueue(T &element)
{
if (isEmpty())
return false;
else {
element = m_pQueue[m_iHead];
m_iHead++;
m_iQueueLen--;
m_iHead = m_iHead % m_iQueueCapacity;
return true;
}
}
template<typename T>
void Queue<T>::traverseQueue()
{
for (int i = m_iHead; i < m_iHead + m_iQueueLen; i++) {
cout << m_pQueue[i%m_iQueueCapacity] << endl;
}
}
template<typename T>
T Queue<T>::getHead()
{
return m_pQueue[m_iHead];
}
template<typename T>
T Queue<T>::getTail()
{
if (m_iTail == 0)
return m_pQueue[m_iQueueCapacity - 1];
return m_pQueue[m_iTail-1];
}
如有不足,欢迎指正!