大概花了一个晚上搭一个中午的时间,完善了一个关于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. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  2. 33.Spring整合Struts2.md

    [toc] 1.搭建环境 在idea下可以在创建module时候选择,注意WEB-INF下的classes和lib两个目录需要手动创建,并且对应的配置文件和依赖的lib需要手动拷贝到这两个文件夹下 2 ...

  3. cxf客户端代码设置设置访问用户名、密码、证书域名不匹配认证通过

    最近和第三方联调,需要调用对方的wsdl,但是调用必须的设置用户名.密码验证.在soapUI里面设置用户名.密码调用通过.但是怎么转换成JAVA代码呢,搜索了好多解决方案,现将代码截图如下: 1.SO ...

  4. java web 学习(2)

    今天突然想到写的测试代码最好随时取出来,在不同的机器上不用老是拷来拷去,还真找着了免费的Svn, svn://www.svn999.com/luhouxiang.javastudy,暂时学习的工程代码 ...

  5. 终于通过了PMP考试,然这只是一个开始。。。

    三个月的辛苦付出,从2015/06/18(本人的生日)开始接受培训,2015/10/6终于收到了PMI发过来的祝贺的邮箱,但是成绩不是很理想.只得了两个B,三个M.但是目标已实现,心情回落. 在这三个 ...

  6. span宽度高度设置

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. SQL2008数据库连接服务器为主机名时连接成功,服务器为Ip地址时链接失败

    如图:

  8. FFT快速傅立叶

    Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n.第二行描述一个位数为n的正整数x.第三行描述一个位数为n的正整数y. Output 输出一行 ...

  9. Rectangle 响应按键

    import QtQuick 2.4 import QtQuick.Window 2.2 Window { visible: true MainForm { anchors.fill: parent ...

  10. magento 修改 paypal order product name

    app/code/core/Mage/Sales/Model/Quote  Item.php public function setProduct($product) { if ($this-> ...