约瑟夫问题(C++面向对象顺序表实现)

约瑟夫问题(C++面向对象顺序表实现)

    • 约瑟夫问题(C++面向对象顺序表实现)
      • Josephus.h
      • Josephus.cpp
      • 说明

Josephus.h

#include
using namespace std;

const int defaultSize = 100;

template<class T>
class Josephus {
    protected:
        T *data;
        int maxSize;
        int last;
    public:
        Josephus(int sz = defaultSize);
        ~Josephus() {
            delete []data;
        }
        int Size() const {
            return maxSize;
        }
        int Length() const {
            return last+1;
        }
        bool getData(int i,T&x){
            if(1<=i&&i<=last+1){
                x = data[i-1];
                return true;
            }
            return false;
        }
        void setData(int i,T& x){
            if(1<=i&&i<=last+1){
                data[i-1] = x;
            }
        }
        bool Insert(int i,T& x);
        bool Remove(int i,T& x);

};

template<class T>
Josephus::Josephus(int sz) {
    if(sz>0) {
        maxSize = sz;
        last = -1;
        data = new T[maxSize];
        if(data == NULL) {
            cout<<"存储分配错误!"<exit(1);
        }
    }
}

template<class T>
bool Josephus::Insert(int i,T& x) {
    if(last == maxSize-1) return false;
    if(i<0||i>last+1) return false;
    for(int j=last;j>=i;j--){
        data[j+1] = data[j];
    }
    data[i] = x;
    last++ ;
    return true;
}

template<class T>
bool Josephus::Remove(int i,T& x){
    if(last == -1) return false;
    if(i<1||i>last+1) return false;
    x = data[i-1];
    for(int j=i;j<=last;j++){
        data[j-1] = data[j];
    }
    last--;
    return true;
}

Josephus.cpp

#include
using namespace std;

#include "Josephus.h"

void JosephusQue(Josephus<int>& J,int n,int s,int m){
    int de[30] = {0};
    int t = n;
    if(m == 1){
        for(int i=1;i<=n;i++){
            cout<<"被淘汰的是第"<"号"<else if(m==0){
        cout<<"游戏规则不合法,必须间隔大于0"<else{
        while(t--){
            for(int i=1;i<=m;i++){
                bool flag = false;
                while(de[s]){
                    s++;
                    s = s%n;
                    flag = true;
                }
                s = (s+1)%n;
                if(s==0) s=n;
            }
            s = s-1;
            if(s==0) s = n;
            int value;
            J.getData(s,value);
            de[s] = 1;
            cout<<"被淘汰的是第"<"号"<//因为这个人删除了  所以要从下一个人开始报数 
            s = s%n;
        }
    } 
}

int main(){
    int t;
    cout<<"请输入您想测试的次数:"<cin>>t;
    while(t--){
        cout<<"请依次输入表长度n、起始位置s、间隔人数m:"<int n,s,m;
        cin>>n>>s>>m;

        Josephus<int> jo(n);
        int sz = jo.Size();
        for(int i=1;i<=n;i++){
            jo.Insert(i-1,i);
        }

        JosephusQue(jo,n,s,m);
    }
    return 0;
}

说明

  • 因时间紧迫,如有错误,欢迎随时指出,我很乐意和大家一起探讨编程。

  • 此程序为面向对象方法与C++语言描述实现,利用C++模板编程,使程序有更好的可扩展性。

你可能感兴趣的:(数据结构)