一、说明
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。
二、代码
#ifndef CYCLEQUEUE_H
#define CYCLEQUEUE_H
#include <iostream>
#include <vector>
#define MAXSIZE 6 //最大队列长度
using namespace std;
class cycleQueue
{
public:
cycleQueue();
int length();
bool insert(int x);
bool del();
void test();
void print();
private:
int* m_pBase;
int m_front;//头指针,若队列不空,指向队列头元素
int m_rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
};
#endif // CYCLEQUEUE_H
#include "cyclequeue.h"
cycleQueue::cycleQueue()
:m_pBase(nullptr)
,m_front(0)
,m_rear(0)
{
m_pBase = (int*) malloc (MAXSIZE*sizeof(int));
if(!m_pBase){
cout<<"malloc fail"<<endl;
}
}
int cycleQueue::length()
{
return (m_rear - m_front + MAXSIZE) % MAXSIZE;
}
bool cycleQueue::insert(int x)
{
if((m_rear+1)%MAXSIZE == m_front){
cout<<"queue is full"<<endl;
return false;
}
m_pBase[m_rear] = x;
m_rear = (m_rear+1) % MAXSIZE;
return true;
}
bool cycleQueue::del()
{
if(m_front == m_rear){
cout<<"queue is empty"<<endl;
return false;
}
m_front = (m_front+1) % MAXSIZE;
return true;
}
void cycleQueue::test()
{
for(int i=0;i<5;i++){
insert(i);
}
print();
del();
del();
print();
insert(3);
insert(4);
insert(5);
insert(6);
print();
}
void cycleQueue::print()
{
for(int i=0;i<MAXSIZE-1;i++){
cout<<"m_pBase["<<i<<"]:"<<m_pBase[i]<<endl;
}
cout<<"m_front:"<<m_front<<endl;
cout<<"m_rear:"<<m_rear<<endl;
}