国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php使用環形鏈表解決約瑟夫問題完整示例

php使用環形鏈表解決約瑟夫問題完整示例

2019-09-14 21:44qw_xingzhe PHP教程

這篇文章主要介紹了php使用環形鏈表解決約瑟夫問題,簡單描述了約瑟夫問題并結合實例形式分析了php基于環形鏈表解決約瑟夫問題的相關操作技巧,注釋中包含較為詳盡的說明便于理解,需要的朋友可以參考下

本文實例講述了php使用環形鏈表解決約瑟夫問題。分享給大家供大家參考,具體如下:

約瑟夫問題:

Josephu問題為:設編號為1,2,...n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生一個出隊編號的序列。并求出最后出列的人是哪個?

PHP實現環形鏈表以及約瑟夫問題的解決:

/**
 * 鏈表結構www.aspku.net
 */
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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩av一级在线观看 | 国产欧美精品一区二区 | 精品一区二区久久久久黄大片 | 亚洲大片av| 国产在线成人 | 亚洲电影在线观看 | 久久久久久久久久久久久久av | 一区在线观看 | 91免费版在线观看 | 亚洲国产一区二区三区日本久久久 | 蜜桃tv一区二区三区 | 国产成人久久一区二区三区 | 久久se精品一区精品二区 | 欧美狠狠 | 免费视频一区 | 在线观看日韩精品 | 日本在线视频一区二区三区 | 99精品免费视频 | 天天躁人人躁人人躁狂躁 | 中文字幕一区二区三区四区不卡 | 久久国产成人 | 99综合在线 | 精品国产乱码久久久久夜 | 国产一区二区免费视频 | 亚洲精品一区二区三区四区高清 | www.av在线.com| 亚洲精品一区 | 日韩一二区 | 成人三级视频网站 | 久久综合伊人 | 国产高清视频一区 | 日韩中文字幕av在线 | 久久免费国产 | 国产不卡精品视频 | 一级一片免费视频 | 国产婷婷在线观看 | 久久久久久久久久影院 | 精品久久久久久国产 | av观看| 91久久精品国产91久久 | 精品免费久久久久久久苍 |