首页 > 网络编程 > PHP编程 > 正文

php使用环形链表解决约瑟夫问题完整示例_php技巧

2018-10-19 16:55:48

本文实例讲述了php使用环形链表解决约瑟夫问题。分享给大家供大家参考,具体如下:

约瑟夫问题:

Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。并求出最后出列的人是哪个?

PHP实现环形链表以及约瑟夫问题的解决:

/** * 链表结构 */class Child{  public $no;  public $next=null;  public function __construct($no=null){    $this->no = $no;  }}/** * 链表操作 */class CycleLink{  private $nodeNum = 0;  /**   * 添加节点   */  public function addNode($head,$node)  {    $currentNode = $head;    while ($currentNode->next!=null && $currentNode->next!=$head) {      $currentNode = $currentNode->next;    }    $currentNode->next = $node;    $currentNode->next->next = $head;    $this->nodeNum++;  }  /**   * 删除节点   */  public function delNode($head,$no)  {    $currentNode = $head;    while ($currentNode->next!=$head) {      if($currentNode->next->no==$no){        $currentNode->next = $currentNode->next->next;        $this->nodeNum--;        break;      }      $currentNode = $currentNode->next;    }  }  /**   * 获取节点数量   */  public function getNodeNum(){    return $this->nodeNum;  }  /**   * 查找节点   */  public function findNode($head,$no){    $node = null;    $currentNode = $head;    while ($currentNode->next!=$head) {      if($currentNode->next->no==$no){        $node = $currentNode->next;        break;      }      $currentNode = $currentNode->next;    }    return $node;  }  public function getNextNode($head,$node){    if($node->next==$head){      return $node->next->next;    }    return $node->next;  }  /**   * 显示节点   */  public function showNode($head)  {    echo "<br/><br/>";    $currentNode = $head;    while ($currentNode->next!=$head){      $currentNode = $currentNode->next;      echo '第 '.$currentNode->no.' 名小孩<br/>';    }  }}/*//创建一个head头,该head 只是一个头,不放入数据$head     = new Child();$childList   = new CycleLink();$child_1   = new Child(1);$child_2   = new Child(2);$child_3   = new Child(3);$child_4   = new Child(4);$childList->addNode($head,$child_1);$childList->addNode($head,$child_2);$childList->addNode($head,$child_3);$childList->addNode($head,$child_4);$childList->showNode($head);echo "<pre>";var_dump($head);$findNode = $childList->findNode($head,3);echo "<pre>";var_dump($findNode);$childList->delNode($head,2);$childList->showNode($head);echo $childList->getNodeNum();exit();*//** * 约瑟夫问题 * 设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列, * 它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 * 并求出最后出列的人是哪个? */class Josephu{  private $head;  private $childList;  private $k;  private $m;  private $n;  public function __construct($n,$k,$m){    $this->k = $k;    $this->m = $m;    $this->n = $n;    $this->createList($n);  // 创建小孩    echo "<br/><br/>当前有 {$n} 个小孩,从第 {$k} 个小孩开始报数,数到 {$m} 退出<br/><br/>";  }  // 数数  public function exec(){    $currentNode = $this->childList->findNode($this->head,$this->k);  // 获取第一个开始报数的人    $_num = 0;  // 当前数到的值    $surplus_num = $this->n;    // 开始报数    while ($surplus_num>1) {  // 只要人数大于1,就继续报数      // 当前报数值      $_num++;      $nextNode = $this->childList->getNextNode($this->head,$currentNode);      // 数至第m个数,然后将其移除。报数恢复到0,重新循环。      if( $_num==$this->m ){        $_num = 0;        $surplus_num--;        // 当前小孩退出        $this->childList->delNode($this->head,$currentNode->no);        echo '<br/>退出小孩编号:' . $currentNode->no;      }      // 移动到下一个小孩      $currentNode = $nextNode;    }    echo '<br/>最后一个小孩编号:' . $currentNode->no;  }  // 创建小孩  private function createList($n){    $this->childList = new CycleLink();    $this->head = new Child();    for ($i=1;$i<=$n;$i++){      $node = new Child($i);      $this->childList->addNode($this->head,$node);    }    $this->childList->showNode($this->head);  }}$josephu = new Josephu(4, 1, 2);$josephu->exec();

运行结果:

第 1 名小孩
第 2 名小孩
第 3 名小孩
第 4 名小孩


当前有 4 个小孩,从第 1 个小孩开始报数,数到 2 退出

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结

希望本文所述对大家PHP程序设计有所帮助。

  • 相关标签:PHP编程
  • 本文发布HTML5中文学习网 ,转载请注明出处,感谢您!
  • 相关文章


  • 曝网友假装外国人写投诉信 ofo秒退押金并回函致歉
  • 苹果市值缩水逾2000亿美元 遭多家投行下调目标价
  • Asp.net Core与类库读取配置文件信息的方法_实用技巧
  • asp.net在Repeater嵌套的Repeater中使用复选框详解_实用技巧
  • 利用IIS调试ASP.NET网站程序的完整步骤_实用技巧
  • Asp.Net Core轻松学习系列之配置文件_实用技巧
  • ASP.NET 页生命周期概述(小结)_实用技巧
  • 详解ASP.NET Core WebApi 返回统一格式参数_实用技巧
  • 2018年网络流行语有哪些?2018年十大网络流行语盘点
  • 华为首席财务官孟晚舟被暂扣 深圳市政府要求加方立即放人!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    作者信息

    kevin

    永远在学习的路上!

    相关教程

  • javascript初级视频教程 javascript初级视频教程
  • jquery 基础视频教程 jquery 基础视频教程
  • javascript三级联动视频教程 javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程 独孤九贱(6)_jQuery视频教程
  • 热门教程