DHU39 链队列(带头结点)模板简单应用算法设计:猴子选大王

问题描述 :

目的:使用C++模板设计链队列的抽象数据类型(ADT)。并在此基础上,使用链队列ADT的基本操作,设计并实现简单应用的算法设计。

内容:(1)请参照单链表的ADT模板,设计链队列的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的单链表ADT原型文件,自行设计链队列的ADT。)

注意:链队列带头结点。

(2)ADT的简单应用:使用该ADT设计并实现应用链队列的算法设计。

应用:猴子选大王是一个小游戏,其规则是:假设n个猴子围成一堆,取数字m为将要被淘汰的数字,从第一个猴子开始数,数到数字m时,则该猴子出列,被淘汰,然后从被淘汰的猴子的下一个开始数,再数到数字m时,这个猴子也被淘汰,从下一个开始数,依次进行,直到剩下一个猴子结束。该猴子即猴子大王。

要求设计一个算法,使用链队列,设计并实现按照以上规则进行选择猴王的算法。为简单起见,直接输出猴王的序号即可,无需保存。

参考函数原型:

template

void monkey_king( LinkQueue S, int n, int m );

输入说明 :

第一行:猴子的数目n

第二行:淘汰数字m

输出说明 :

第一行:猴王的序号

输入范例 :

30
4
输出范例 :

6

#include 
#include 
#include 
#include 
#include 
using namespace std;

template
void monkey_king(queue S, int n, int m)
{
    for (int i = 1;i <= n;i++)
    {
        S.push(i);
    }
    while (S.size() > 1)
    {
        int count;
        for (count = 1;count < m;count++)
        {
            S.push(S.front());
            S.pop();
        }
        S.pop();
    }
    cout << S.front()<<" " << endl;
}

int main()
{
    queueQ;
    int n, m;
    cin >> n >> m;
    monkey_king(Q, n, m);
    return 0;
}

你可能感兴趣的:(DHU39 链队列(带头结点)模板简单应用算法设计:猴子选大王)