Java的约瑟夫环问题

开发工具与关键技术:MyEclipse、java
作者:清晨
撰写时间:8.18
/**
	 * 算法背景:
	 * 约瑟夫是一位将军,罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这场浩劫。
	 * 这41个人中,包括历史学家josephus和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。
	 * 大家决定了一个自杀方案,所有这41人围城一个圆圈,由第一个人开始顺时针报数,
	 * 没报数为3的人就立刻自杀,然后由下一个人重新开始报数仍然是每报数为3的人就立刻自杀,......,知道所有人都自杀死亡为止.
	 * 才出现约瑟夫环的算法
	 * @param totalNum
	 * @param countNum
	 * @param startNO
	 */
/**
 * 约瑟夫环
 * @author Administrator
 *
 */
public class Josephring {
	Node front;
	Node rear;
	int count;
	int[] array = new int[count];
	
	public Josephring(){
		initiate();
	}
	public Josephring(int sz){
		initiate();
	}
	private void initiate(){
		front = rear = null;
		count = 0;
	}
	public void append(Object obj){
		Node newNode = new Node(obj,null);
		if(rear != null){
			rear.next = newNode;
		   rear = newNode;
		}
		if(front == null)
			front =rear= newNode;
		count ++;
	}
	public Object delete() throws Exception{
		if(count == 0)
			throw new Exception("队列已空!");
		
		Node temp = front;
		front = front.next; 
		count --;
		return temp.getElement();
	}
	public Object getFront() throws Exception{
		if(count == 0)
			throw new Exception("队列已空!");
		return front.getElement();
	}
	public boolean notEmpty(){
		return count == 0;
	}
	//约瑟夫环
	public void baoShu(int n,int k,int m) throws Exception{   
		int i;
		for(i=1;i<=n;i++)
			append(new Integer(i));
                //前k个元素先出队再入队
		for(i=1;i
	 class Node{
		Object data;
		Node next;
		
		Node(Object obj,Node nextval){
			data = obj;
			next = nextval;
		}
		
		Node(Node nextval){
			next = nextval;
		}
		public Object getElement(){
			return data;
		}
		public void setElement(Object obj){
			data = obj;
		}
		public String toString(){
			return data.toString();
		}
	}
	public static void main(String[] args) {
		
		Josephring josephring1=new Josephring();
		try {
			//baoshu(有几位数,从3号开始,数5位,就出来。
			josephring1.baoShu(9, 3, 5);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

效果图

在这里插入图片描述

你可能感兴趣的:(Technology)