c++面向对象实现约瑟夫环
时间: 2023-08-17 10:27:05 浏览: 128
基于 C++用MFC做一个约瑟夫环的可视化界面
好的,下面是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; // 队列的头结点
Josephus(int n, int m) {
this->n = n;
this->m = m;
head = NULL;
}
// 初始化队列
void init() {
for (int i = 1; i <= n; i++) {
Node *p = new Node(i);
if (head == NULL) {
head = p;
p->next = head; // 队列首尾相连
} else {
Node *tail = head;
while (tail->next != head) {
tail = tail->next;
}
tail->next = p;
p->next = head; // 队列首尾相连
}
}
}
// 出列操作
void out() {
Node *p = head, *pre = head;
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`。类中有两个方法:`init()` 用于初始化队列;`out()` 用于出列操作;main() 函数中创建了一个 `Josephus` 对象,调用 `init()` 和 `out()` 方法,完成约瑟夫环的求解。
具体实现细节可以参考代码注释。
阅读全文