大概花了一个晚上搭一个中午的时间,完善了一个关于Josephus的程序,这个Josephus游戏可是非常经典的算法,作为一个想从事软件的人最好能够理解一下,毕竟这个计算机教材上也讲过类似题目,具体的关于问题的描述我就不多说了,这个Josephus一般都是用队列来实现,当然了对于一个具体的算法而言数据结构并不是第一重要的,最重要的还是算法本身。这个程序关键之处还是在于如何巧妙地实现对淘汰的人的处理,用队列比较好实现。

public class CountDown {
   
public static Object josephus(Queue_List q,int k)throws QueueStackEmpty,QueueStackFull{

if(q.isEmpty()) return null;
while(q.size()>1){ 
q.traversal();//遍历所有队列元素 
for(int i=1;i<k;i++){
q.enqueue(q.dequeue()); 
}   
Object e=q.dequeue();
System.out.println("\n孩子"+e+"退出");
System.out.print("\n队头指针指向"+q.getItem(q.f)+"队尾指针指向"+q.getItem(q.r-1)+"\n");
}
return q.dequeue();
}
//将一组对象组织为一个队列
public static Queue_List buildQueue(Object[] a){
Queue_List ql = new Queue_List();    
for(int i=0;i<a.length;i++){
ql.enqueue(a[i]);
}
return ql;
}
public static void main(String[] args) {
 try{ 
String[] kid ={
"Alice","Bob","Cindy","Oliver","July",
"Rikc","Robin","Bill","Tom","Sam","Kim",
"Lin","Linda","UU","Baidu","Web"
};
System.out.println("最终的幸运者是:"+josephus(buildQueue(kid),1));
}catch(QueueStackEmpty e){
System.out.println("栈空了");
}catch(QueueStackFull e){
System.out.println("栈满了");
}
}

}
//模仿队列数据结构的类
class  Queue_List   {
   //队列的元素仍不能超过SIZE个元素,超过部分就会回到下标为0处,是否覆盖原来的数据取决于队头指针的值
    public final int SIZE = 17;
public Object[] Q;
    int f,r; //分别指向队头元素和队尾元素
public Queue_List(){
Q = new Object[SIZE];
f = -1; //队头指针初始化为-1;
}
public Queue_List(int num){
   Q= new Object[num];
   f = -1; //队头指针初始化为-1;
}
//返回指定元素的下标值
public int getElement(Object obj){
for(int i=0;i<r;i++){
if(Q[i].equals(obj))return i;
}
return -2;
}
//返回指定下标处的值
public Object  getItem(int index){
return Q[index];
}
//替换或设置指定下标处的值
public void setItem(int index,Object obj){
Q[index]=obj;
}
//弹出队头元素
public Object dequeue(){
       if(isEmpty())
       throw  new QueueStackEmpty("栈为空");
int i=f; 
f++; //队头指针往后移动一位
       return Q[i];
    }
//添加元素到队列中,添加成功返回true
public boolean enqueue(Object obj)throws QueueStackFull{
if(f == -1){  f=0;r=0; }
if(r>=(SIZE)){ //如果队尾指针已经到达尾部 
if(f==0){
throw new QueueStackFull("栈满了"); 

int tempF=f,tempSize=size();
for(int i=0,j=tempF;i<tempSize;i++,j++){
Q[i]=Q[j];
}
//重新定位队头指针和队尾指针
f=0;r=tempSize; 
}    
    Q[r]=obj;
    r++;    //队尾指针总是指向最后一个将要添加的元素  
    return true; 
    }
 
public int size() {   
return  (r-f);
}
 
public boolean isEmpty() {
   if(size()==0 || f== -1)
   return true;
return false;
}
public void traversal(){ 
int j=0;   
for(int i=f;i<r;i++){
  j++;
  if(j%10==0)
  System.out.println();
  System.out.print("  "+ Q[i]);
  }  
}
}

一个非常有趣的算法程序(有趣只针对程序猿)就是Josephus问题的更多相关文章

  1. 转一个csdn看到的帖子:而立之年的程序猿失业了 [问题点数:0分,结帖人jinxingfeng_cn]

    http://bbs.csdn.net/topics/390612263?page=1#post-395768948

  2. 一个net程序猿必备工具

    自古以来,人类的进步都是依赖于工具的进步,从刀耕火种,到使用青铜器,再到现在的科技,每一次都使我们的工作效率提高了无数倍,所以一个好的工具能使我们提高无数倍的工作效率,下面,我就根据自己简单的总结一下 ...

  3. 新建一个DataTable(只针对一列)

    /// <summary> /// 新建一个DataTable(只针对一列) /// </summary> /// <param name="dataStr&q ...

  4. 关于只针对ie7浏览器的css问题

    如代码: .centerDiv .search_k2{ margin-left: 18px; *margin-left: 9px; margin-top: 10px; height: 40px;} 中 ...

  5. WaitForSingleObject与WaitForMultipleObjects用法详解(好用,而且进入一个非常高效沉睡状态,只占用极少的CPU时间片)

    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects ...

  6. 面试王牌 JAVA 多态只针对方法 不针对属性

    子类是永远继承父类的非私有化方法,当子类中重写父类方法时,调用的是子类的方法,没有重写时,调用的是父类中的方法 1 多态是只针对方法,而不是属性的,但是写法上,子类重写父类的属性,编译器是不会报错的 ...

  7. 想让一个Widget成为模态,我们只需要对其设置setAttribute(Qt::WA_ShowModal, true);

    想让一个Widget成为模态,我们只需要对其设置: setAttribute(Qt::WA_ShowModal, true); 注意:这是QWidget的成员函数 ,也就是说,QWidget可以显示为 ...

  8. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  9. 每一个程序猿必知之SEO

    似乎由于受这篇文章的影响 http://katemats.com/what-every-programmer-should-know-about-seo/ 于是我也觉得我应该写一个每一个程序猿必知之S ...

随机推荐

  1. Android中Application全局方法(变量)的调用

    Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息.通常我们是 ...

  2. PHP 实现无限极栏目分类

    首先,创建一个DB CREATE TABLE IF NOT EXISTS `class` ( `id` mediumint(6) NOT NULL AUTO_INCREMENT, `title` va ...

  3. Visual Studio 2013 无法启动 IIS Express 的解决办法

    关于 ASP.NET Web 开发服务器.本地 IIS和 IIS Express 的区别,请参见<VS2013无法启动IIS Express Web的解决办法>,此文章最后提到的部分,即是 ...

  4. get the text value of a selected option.

    <select id="myselect"> <option value="1">Mr</option> <optio ...

  5. 【HAOI2011】向量

    [题目描述] 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个 ...

  6. META http-equiv 大全

    META http-equiv 大全 HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容.常用的HTTP-EQUIV类型有: 1.Content ...

  7. jquery图片轮播代码

    自己写的轮播代码 来张样式效果图 先贴HTML样式 <body> <div id = "wrap"> <div id="lunbo-img& ...

  8. CSS,点击去除虚线边框代码

  9. 用webclient.DownloadFile下载exe文件时大小为0

    用自己写的下载软件从服务器端下载文件,别的文件能下,但exe文件显示下载文件大小为0,连接超时,原因是服务上发布的下载文件夹的虚拟目录的属性有问题, 包含.exe 文件的虚拟目录已启用执行应用程序权限 ...

  10. 如何搭建一个angularJS应用

    以写一个hello word为例,首先引入angular.js库文件   <!doctype html> <html ng-app> <head> <titl ...