php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表
参考资料:传智播客韩顺平老师一周玩转算法公开课视频
实例:用php单向链表实现水浒英雄排行
1 <?php 2 header(\'content-type:text/html;charset=utf-8\'); 3 /** 4 * 定义水浒英雄排行类 5 * 可以想像成有一个线性表:Heros = (h1,h2,h3……) $head的位置就是h1前面的那个位置 6 */ 7 class Heros{ 8 /** 9 * @var int $id 编号 10 */ 11 public $id; 12 13 /** 14 * @var string $name 真实姓名 15 */ 16 public $name; 17 18 /** 19 * @var string $nickname 外号 20 */ 21 public $nickname; 22 23 /** 24 * @var object $head hero类的一个实例的下一个对象 25 */ 26 public $next; 27 28 function __construct($id = \'\', $name = \'\', $nickname = \'\') 29 { 30 $this->id = $id; 31 $this->name = $name; 32 $this->nickname = $nickname; 33 } 34 35 36 37 } 38 39 /** 40 * 添加水浒英雄 41 * @param object $head Heros类的空对象(栈顶) 42 * @param object $hero Heros类的一个实例 43 */ 44 function addHero($head, $hero) 45 { 46 //定义一个当前实例,先初始化 47 $current = $head; 48 //定义一个变量代表是否是重复值 49 $flag = false; 50 while($current->next != null) 51 { 52 if($current->next != null){ 53 break; 54 } 55 else if($current->next->id = $hero->next->id) 56 { 57 $flag = true; 58 } 59 $current = $current->next; 60 } 61 if(!$flag) 62 { 63 $hero->next = $current->next; 64 $current->next = $hero; 65 } 66 67 } 68 69 /** 70 * 修改英雄信息 71 * @param object $head Heros类的空对象(栈顶) 72 * @param object $hero Heros类的一个实例 73 */ 74 function updateHero($head, $hero) 75 { 76 $current = $head; 77 while($current->next != null) 78 { 79 if($current->next->id = $hero->id) 80 { 81 break; 82 } 83 $current = $current->next; 84 } 85 if($current->next == null) 86 { 87 echo \'您要修改的编号为\'.$hero->id.\'的英雄不存在!\'; 88 } 89 else{ 90 $current->next->name = $hero->name; 91 $current->next->nickname = $hero->nickname; 92 } 93 } 94 95 /** 96 * 删除某个英雄 97 * @param object $head Heros类的空对象(栈顶) 98 * @param int $id 英雄编号 99 */ 100 function delHero($head, $id) 101 { 102 $current = $head; 103 while($current->next != null) 104 { 105 if($current->next->id = $id) 106 { 107 $flag = true; 108 break; 109 } 110 $current = $current->next; 111 } 112 if(!$flag) 113 { 114 $current->next = $current->next->next; 115 } 116 else{ 117 echo \'您要删除的编号为\'.$hero->id.\'的英雄不存在!\'; 118 } 119 } 120 121 /** 122 * 显示英雄排行榜 123 * @param object $head Heros类的空对象(栈顶) 124 */ 125 function showHeros($head) 126 { 127 $current = $head; 128 while($current->next != null) 129 { 130 echo \'第\'.$current->next->id.\'位,姓名:\'.$current->next->name.\'外号:\'.$current->next->nickname.\'<br/>\'; 131 $current = $current->next; 132 } 133 } 134 135 $head = new Heros(); 136 $h1 = new Heros(1,\'宋江\',\'及时雨\'); 137 addHero($head,$h1); 138 $h2 = new Heros(2,\'卢俊义\',\'玉麒麟\'); 139 addHero($head,$h2); 140 $h3 = new Heros(3,\'吴用\',\'智多星\'); 141 addHero($head,$h3); 142 showHeros($head); 143 144 ?>
一、内存分配(c)
因为php底层是c
用上面的例子来说:
关于内存分配的一点说明:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 – 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
一般来说:内存分配根据以下规则:
(1)基本数据类型一般放在栈区
(2)复合数据类型一般放在堆区
二、案例说明:
对象实例化的数据在堆区,但其名称在栈区,其结构如下: