队列首尾相连成为环形队列,下面实现环形队列的基本算法:
注意:插入元素是插在队尾,队尾加一,队列长度加一;删除元素是在队头,队头也是加一,但是总长度加一。由于是环形队列,在环上循环排列,因此元素的实际位置是当前 编号对队列容量取余后的结果,取余方便后面的遍历运算。
MyQueue.h
class MyQueue
{
public:
MyQueue(int queueCapacity); //创建队列
~MyQueue();//销毁队列
void CLearQueue();//清空队列
bool QueueEmpty();//判断队列是否为空
int QueueLength();//求队列长度
bool EnQueue(int element);//新元素入队
bool DeQueue(int &element);//第一个元素出队
void QueueTraverse();
private:
int *m_pQueue;//队列数组指针
int m_iQueueLen;//队列元素个数
int m_iQueueCapacity;//队列数组容量
int m_iHead;
int m_iTail;
};
MyQueue.cpp
#include"MyQueue.h"
#include<iostream>
using namespace std;
MyQueue::MyQueue(int queueCapacity) //创建队列
{
m_iQueueLen=0;
m_iQueueCapacity=queueCapacity;
m_pQueue=new int[m_iQueueCapacity];
m_iHead=0;
m_iTail=0;
}
MyQueue::~MyQueue()//销毁队列
{
delete []m_pQueue;
}
void MyQueue::CLearQueue()//清空队列
{
m_iHead=0;
m_iTail=0;
m_iQueueLen=0;
}
bool MyQueue::QueueEmpty()//判断队列是否为空
{
if(m_iQueueLen==0)
{
return true;
}
else
{
return false;
}
}
int MyQueue::QueueLength()//求队列长度
{
return m_iQueueLen;
}
bool MyQueue::EnQueue(int element)//新元素入队
{
if(m_iQueueLen==m_iQueueCapacity) //队列已满
{
return false;
}
else
{
m_pQueue[m_iTail]=element;
m_iTail++;
m_iTail=m_iTail%m_iQueueCapacity;
m_iQueueLen++;
return true;
}
}
bool MyQueue::DeQueue(int &element)//第一个元素出队
{
if(QueueEmpty()) //队列为空
{
return false;
}
else
{
element=m_pQueue[m_iHead];
m_iHead++;
m_iHead=m_iHead%m_iQueueCapacity; //因为是环形队列,所以取余得到
m_iQueueLen--;
return true;
}
}
void MyQueue::QueueTraverse()
{
for(int i=m_iHead;i<m_iHead+m_iQueueLen;i++)//保证遍历到的长度为m_iQueueLen
{
cout<<m_pQueue[i%m_iQueueCapacity]<<endl;
}
}
main.cpp
#include<iostream>
#include"MyQueue.h"
using namespace std;
void main()
{
MyQueue *q=new MyQueue(5);
q->EnQueue(1);
q->EnQueue(2);
q->EnQueue(3);
q->EnQueue(4);
q->EnQueue(5);
q->QueueTraverse();
cout<<"队列的长度为:"<<q->QueueLength()<<endl;
int e=0;
q->DeQueue(e);
cout<<"删除的元素是:"<<e<<endl;
q->QueueTraverse();
delete q;
q=NULL;
system("pause");
}
运行结果如下: