循环队列解决约瑟夫环问题。
来源:互联网 发布:mac如何显示桌面 编辑:程序博客网 时间:2024/05/22 14:22
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
使用数据结构中的循环队列来解决这个问题:
Status.h
#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;
main.h
#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;typedef struct{ ElemType *base; int front; int rear; int MAXSIZE;}SqQueue;Status InitQueue(SqQueue& Q,int n){ Q.base = new ElemType[100]; if(!Q.base) { cout << "创建队列失败!"; return ERROR; } Q.front=Q.rear=0; Q.MAXSIZE = n+1;//MAXSIZE是总人数+1,是为了留出一个空位置来放置rear return OK;}void QueueTraverse(SqQueue Q){int i;i=Q.front;while(i!=Q.rear){cout<<Q.base[i]<<" ";i=(i+1)%Q.MAXSIZE;}cout<<endl;}Status EnQueue(SqQueue& Q,ElemType e){ if((Q.rear+1)%Q.MAXSIZE==Q.front) { cout << "队列已满!"; return ERROR; } Q.base[Q.rear] = e; Q.rear = (Q.rear+1)%Q.MAXSIZE; return OK;}Status DeQueue(SqQueue& Q,ElemType& e){ if(Q.front==Q.rear) { cout << "队列为空!"; return ERROR; } e = Q.base[Q.front]; Q.base[Q.front] = 0; Q.front = (Q.front+1)%(Q.MAXSIZE-1);//因为此时的MAXSIZE比总的人数大1,所以需要减去1 return OK;}int main(){ int n,m,i=1; SqQueue Q; ElemType e; cout << "请输入n个人(n<=100):"; cin >> n; if(n>100 || n<1) { cout << "输入人数错误!"; return 0; } InitQueue(Q,n); while(i<=n)//入队操作 { EnQueue(Q,i); i++; } cout << "\n此时的序列顺序为:"; QueueTraverse(Q); cout << "\n请输入第m个人出队(1<=m<=n):"; cin >> m; if(m>n || m<1) { cout << "m输入错误!"; return 0; } cout << endl; int Count = n;//用来记录剩下的人数 while(Count != 1) { i = 1;//i用来控制是第几个人报数 while(i != m)//当i的值不等于m的值时 { Q.front = (Q.front+1)%(Q.MAXSIZE-1);//因为此时的MAXSIZE比总的人数大1,所以需要减去1 if(Q.base[Q.front] != 0)//当此时不为0的话,i++用来控制第几个人 { i++; } } DeQueue(Q,e); while(Q.base[Q.front] == 0)//当此时为0的时候,循环找到下一个不为0的位置 { Q.front = (Q.front+1)%(Q.MAXSIZE-1); } cout << "序号:" << e << "出局!\n"; Count--; } DeQueue(Q,e); cout << "\n最后一个是:" << e << endl; return 0;}
测试:
0 0
- 循环队列解决约瑟夫环问题
- 循环队列解决约瑟夫环问题。
- 循环队列 约瑟夫问题
- 队列模拟解决约瑟夫环问题
- 循环链表--解决约瑟夫环问题
- c++循环列表解决约瑟夫环问题
- poj3750约瑟夫环,循环队列
- 利用循环链队列求解约瑟夫环问题(…
- Luogu-p1996约瑟夫问题(循环队列)
- 用循环链解决解决约瑟夫问题
- 循环链表(解决约瑟夫环问题)(VS…
- 循环列表的Java实现,解决约瑟夫环问题
- 简单的循环判断解决约瑟夫环问题
- C#单向循环列表 解决 约瑟夫问题
- 用循环列表解决一个约瑟夫问题
- 约瑟夫问题循环链表解法、队列解法
- php通过循环链解决约瑟夫环
- 解决下约瑟夫环问题
- IDEA快捷键+使用小技巧
- 整数转字符串
- Java-CentOS下Nginx+Tomcat
- 三叶先生(一)
- Android Activity 之间传递数据
- 循环队列解决约瑟夫环问题。
- 初识Mybatis框架,实现增删改查等操作
- HTTP/HTTPS
- 文章标题
- JAVA设计模式之解释器模式
- 多层架构设计与实践
- 面向对象之抽象类
- AFL的介绍
- Java如何像Python一样简洁地构造和解析Json 数据