c++面向对象思想编写约瑟夫问题全部代码
时间: 2023-08-10 21:30:59 浏览: 81
好的,下面是C++面向对象思想编写约瑟夫问题的全部代码:
```c++
#include <iostream>
using namespace std;
// 定义一个结点类
class Node {
public:
int data;
Node *next;
Node(int d) {
data = d;
next = NULL;
}
};
// 定义一个约瑟夫问题类
class Josephus {
public:
int n, m; // n表示总人数,m表示出列的间隔
Node *head, *tail; // 队列的头和尾结点
Josephus(int n, int m) {
this->n = n;
this->m = m;
head = tail = NULL;
}
// 初始化队列
void init() {
for (int i = 1; i <= n; i++) {
Node *p = new Node(i);
if (head == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
tail->next = head; // 队列首尾相连
}
// 出列操作
void out() {
Node *p = head, *pre = tail;
while (n > 1) {
for (int i = 0; i < m - 1; i++) {
pre = p;
p = p->next;
}
pre->next = p->next;
delete p;
p = pre->next;
n--;
}
cout << "最后一个出列的人是:" << p->data << endl;
}
};
int main() {
int n, m;
cout << "请输入总人数和出列的间隔:";
cin >> n >> m;
Josephus j(n, m);
j.init(); // 初始化队列
j.out(); // 开始出列操作
return 0;
}
```
解释一下代码:
首先定义了一个结点类 `Node`,用于构建链表;然后定义了约瑟夫问题类 `Josephus`,其中包含了总人数 `n`、出列的间隔 `m`、队列的头和尾结点 `head`、`tail`。类中有三个方法:`init()` 用于初始化队列;`out()` 用于出列操作;main() 函数中创建了一个 `Josephus` 对象,调用 `init()` 和 `out()` 方法,完成约瑟夫问题的求解。
具体实现细节可以参考代码注释。
阅读全文