循环队列
循环队列:解决了假溢出问题,让队列的应用更加灵活了一点。
关键技巧:
判断队空:front=rear
判断队满:(rear+1)%size=front 当队尾指针指向队头指针的前一个指针时,队列已满,所以队列中最多可存size-1个元素。
抽象数据类型表示:
//循环队列抽象数据类型
class CirQueue
{
public:
//构造函数、析构函数
CirQueue(int sz)
{
size=sz;
front=rear=0; //初始化为0
data=new int[size]; //开辟这个队列存储空间
}
~CirQueue(){}
//入队、出队函数
bool EnQueue(const int x);
int DeQueue();
void Output();
private:
int *data; //队列元素指针
int front,rear;
int size;
};
关键算法:
/*
入队算法:
1、
*/
bool CirQueue::EnQueue(const int x)
{
if((rear+1)%size==front)
{
cout<<"队列已满"<<endl;
return false;
}
else
{
data[rear]=x;
//技巧,处理假溢出情况
rear=(rear+1)%size;
return true;
}
}
/*
出队算法:
1、
*/
int CirQueue::DeQueue()
{
int x;
if(rear==front)
{
cout<<"队列为空"<<endl;
return -1;
}
else
{
x=data[front];
front=(front+1)%size;
return x;
}
}
/*
输出队列算法:
1、
*/
void CirQueue::Output()
{
int temp=front;
while(temp!=rear)
{
cout<<data[temp]<<endl;
temp=(temp+1)%size;
}
}
主程序:
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"--------------循环队列-----------"<<endl;
CirQueue cq(6); //只能存size-1个元素
cq.EnQueue(1);
cq.EnQueue(2);
cq.EnQueue(3);
cq.EnQueue(4);
cq.EnQueue(5);
cq.Output();
cout<<"第一个出队"<<cq.DeQueue()<<endl;
cout<<"第二个出队"<<cq.DeQueue()<<endl;
cq.Output();
cout<<"第三个出队"<<cq.DeQueue()<<endl;
cout<<"第四个出队"<<cq.DeQueue()<<endl;
cout<<"第五个出队"<<cq.DeQueue()<<endl;
cout<<"第六个出队"<<cq.DeQueue()<<endl;
cq.EnQueue(345);
cq.Output();
return 0;
}
测试结果:
--------------循环队列-----------
1
2
3
4
5
第一个出队1
第二个出队2
3
4
5
第三个出队3
第四个出队4
第五个出队5
队列为空
第六个出队-1
345
请按任意键继续. . .

浙公网安备 33010602011771号