循环队列

实现基础:静态数组

初始化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编辑  收藏  举报

导航