c语言用栈求约瑟夫来回报数把报到指定数的人输出问题
时间: 2024-05-05 21:22:19 浏览: 98
数据结构课程设计-用栈实现表达式求值的方法详解
约瑟夫问题可以用循环链表或者栈来解决。以下是使用栈来解决约瑟夫问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 栈的最大容量
typedef struct {
int data[MAXSIZE]; // 栈中存放的数据
int top; // 栈顶指针
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack *s) {
return s->top == MAXSIZE - 1;
}
// 入栈
void push(Stack *s, int value) {
if (isFull(s)) {
printf("Stack is full.\n");
exit(1);
}
s->data[++s->top] = value;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty.\n");
exit(1);
}
return s->data[s->top--];
}
// 约瑟夫问题求解
void josephus(int n, int m, int k) {
Stack s1, s2;
initStack(&s1);
initStack(&s2);
// 先将所有人入栈
for (int i = n; i >= 1; i--) {
push(&s1, i);
}
int count = 1; // 计数器,记录报数
int flag = 0; // 标志,用来判断当前栈是否为 s1
while (!isEmpty(&s1) || !isEmpty(&s2)) {
Stack *p = isEmpty(&s1) ? &s2 : &s1; // 当 s1 栈为空时,从 s2 中取出元素
Stack *q = isEmpty(&s1) ? &s1 : &s2; // 当 s1 栈为空时,将元素放入 s1 中
int value = pop(p);
if (count == m) {
if (value == k) {
printf("%d\n", value);
return;
}
count = 1;
} else {
push(q, value);
count++;
}
flag = !flag;
}
}
int main() {
int n, m, k;
printf("请输入总人数n:");
scanf("%d", &n);
printf("请输入报数的值m:");
scanf("%d", &m);
printf("请输入要输出的人的编号k:");
scanf("%d", &k);
josephus(n, m, k);
return 0;
}
```
在这个示例代码中,我们使用了两个栈来模拟人员报数的过程。首先将所有人入栈,然后从栈中取出元素进行报数。当报到指定数时,将该元素输出,如果该元素为指定的人,则结束程序。如果报数未结束,则将该元素放回另一个栈中,继续进行报数。最后,当两个栈都为空时,程序结束。
阅读全文