循环队列
循环队列:解决了假溢出问题,让队列的应用更加灵活了一点。
关键技巧:
判断队空: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
请按任意键继续. . .