php约瑟夫循环,php通过循环链解决约瑟夫环

本想着用php写些数据结构提升一下,写到链的时候看到约瑟夫环问题,尝试用循环链写了一下

约瑟夫环:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列

代码:

header(“Content-type: text/html; charset=utf-8”);

/**

* 约瑟夫环

*/

/**

* 结点

*/

class Node {

/*结点id*/

public $id;

/*结点数据域*/

public $data;

/*下一个结点的指针域*/

public $_next;

function __construct($data) {

$this->id = null;

$this->data = $data;

$this->_next = null;

}

}

/**

* 循环链

*/

class CircularLinkedList {

/*链表头指针*/

private $_header;

/*链表尾指针*/

private $_end;

/*存储链表数据的数组*/

private $data = array();

function __construct($node) {

$this->_header = 0;

$this->_end = 0;

$node->id = $this->_end;

$node->_next = $this->_header;

$this->data[$this->_end] = $node;

}

/*增加结点*/

public function add_list($node) {

$current = $this->data[$this->_header];

while($current->_next !== $this->_header) {

$current = $this->data[$current->_next];

}

$this->_end++;

$node->id = $this->_end;

$node->_next = $this->_header;

$this->data[$current->id]->_next = $node->id;

$this->data[$this->_end] = $node;

}

/*插入结点*/

public function insert_list($where,$node) {

if($where == 1){

$current = $this->data[$this->_header];

while($current->_next !== $this->_header) {

$current = $this->data[$current->_next];

}

$this->_end++;

$node->id = $this->_end;

$node->_next = $this->data[$this->_header]->id;

$this->data[$current->id]->_next = $node->id;

$this->data[$this->_end] = $node;

$this->_header = $node->id;

}

else{

$current = $this->data[$this->_header];

for($i=1;$i

$current = $this->data[$current->_next];

}

$this->_end++;

$node->id = $this->_end;

$node->_next = $this->data[$current->_next]->id;

$this->data[$current->id]->_next = $node->id;

$this->data[$this->_end] = $node;

}

}

/*删除指定结点*/

public function del_list($where) {

$current = $this->data[$this->_header];

for($i=1;$i

$current = $this->data[$current->_next];

}

$next = $this->data[$current->id]->_next;

if($where == 1) {

$current_2 = $this->data[$this->_header];

while($current_2->_next !== $this->_header) {

$current_2 = $this->data[$current_2->_next];

}

$this->_header = $next;

$this->data[$current_2->id]->_next = $next;

unset($this->data[$current->id]);

}

else{

$this->data[$current->id]->_next = $this->data[$next]->_next;

unset($this->data[$next]);

}

}

/*循环链的长度*/

public function get_length() {

$current = $this->data[$this->_header];

$length = 1;

while($current->_next !== $this->_header) {

$length ++;

$current = $this->data[$current->_next];

}

return $length;

}

/*改变头指针*/

public function change_header($where) {

$current = $this->search_node($where);

$this->_header = $current->id;

}

/*查找第n个结点*/

public function search_node($where) {

$current = $this->data[$this->_header];

for($i=1;$i

$current = $this->data[$current->_next];

}

return $current;

}

public function set_header($header) {

$this->_header = $header;

}

/*输出循环链*/

public function get_list() {

$current = $this->data[$this->_header];

while($current->_next !== $this->_header) {

echo “[“.$current->id.”]”.$current->data.”—>”;

$current = $this->data[$current->_next];

}

echo “[“.$current->id.”]”.$current->data.”—>[“.$this->data[$current->_next]->id.”]”.$this->data[$current->_next]->data;

echo “
———————————————–
”;

}

}

/*约瑟夫环对象*/

class JosephCycle {

/*循环链*/

private $linkedlist;

/*开始的位置*/

private $_begin;

/*开始到被踢出者的距离*/

private $_distance;

/**

* 构造函数

* @param object $linkedlist 循环链

* @param int $begin 从第几个开始

* @param int $distance 从开始到被踢者的距离

*/

function __construct($linkedlist,$begin,$distance) {

$this->linkedlist = $linkedlist;

$this->_begin = $begin;

$this->_distance = $distance;

}

public function index() {

$length = $this->linkedlist->get_length();

$this->linkedlist->change_header($this->_begin);

for($i=1;$i

$node = $this->linkedlist->search_node($this->_distance);

$this->linkedlist->del_list($this->_distance);

$this->linkedlist->set_header($node->_next);

$this->linkedlist->get_list();

}

}

}

$list = new CircularLinkedList(new Node(“测试1”));

$list->add_list(new Node(“测试2”));

$list->add_list(new Node(“测试3”));

$list->add_list(new Node(“测试4”));

$list->add_list(new Node(“测试5”));

$list->add_list(new Node(“测试6”));

$list->add_list(new Node(“测试7”));

$list->add_list(new Node(“测试8”));

$list->add_list(new Node(“测试9”));

$list->add_list(new Node(“测试10”));

$list->add_list(new Node(“测试11”));

$list->add_list(new Node(“测试12”));

$list->add_list(new Node(“测试13”));

$list->get_list();

$solution = new JosephCycle($list,6,8);

$solution->index();

?>

如有错误,敬请指正,虚心接受

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值