循环队列
实现基础:静态数组
初始化rear,front均为-1,头文件如下
1 template<class T>
2 class queue{
3 private:
4 int rear;
5 int front;
6 enum{MAXN = 200};
7 T s[MAXN];
8 public:
9 queue();
10 void push(const T& item);
11 void pop();
12 T front();
13 void makeEmpty();
14 bool isEmpty() const;
15 bool isFull() const;
16 int size();
17 };
其中主要的函数为
1.push()
template<class T>
void queue<T>::push(const T&item)
{
if(!isFull()){
rear = (rear+1)%MAXN;
s[rear] = item;
}else cout<<"full!"<<endl;
}
注意队列满的条件并不是rear==MAXN-1,而是(rear+1)%MAXN == front,加1是为了与isEmpty()进行区分
2.pop()
template<class T>
void queue<T>::pop()
{
if(!isEmpty()){
front = (front+1)%MAXN;
return s[front];
}else cout<<"empty!"<<endl;
}
3.isFull()
template<class T>
bool queue<T>::isEmpty() const
{
return (rear+1)%MAXN == front;
}
4.isEmpty()
template<class T>
bool queue<T>::isEmpty() const
{
return rear == fron;
}
经典应用:
1.约瑟夫环问题。
约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围 成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有 人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 稍微
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
用循环队列解决:
#include <iostream>
#include <queue>
using namespace std;
const int MAX = 100;//总人数
const int N = 8; //需退出的编号
int main()
{
queue<int> qu;
for(int i=0;i<=MAX;i++)qu.push(i);
int k=1;
while(qu.size()>1){
if(k%N)qu.push(qu.front());
qu.pop();
k++;
}
cout<<qu.front()<<endl;
return 0;
}
posted on 2015-10-30 11:34 WindInWillows 阅读(238) 评论(0) 编辑 收藏 举报