php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表
2012-11-21 16:39
1126 查看
参考资料:传智播客韩顺平老师一周玩转算法公开课视频
实例:用php单向链表实现水浒英雄排行
一、内存分配(c)
因为php底层是c
用上面的例子来说:
关于内存分配的一点说明:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
一般来说:内存分配根据以下规则:
(1)基本数据类型一般放在栈区
(2)复合数据类型一般放在堆区
二、案例说明:
对象实例化的数据在堆区,但其名称在栈区,其结构如下:
实例:用php单向链表实现水浒英雄排行
<?php header('content-type:text/html;charset=utf-8'); /** * 定义水浒英雄排行类 * 可以想像成有一个线性表:Heros = (h1,h2,h3……) $head的位置就是h1前面的那个位置 */ class Heros{ /** * @var int $id 编号 */ public $id; /** * @var string $name 真实姓名 */ public $name; /** * @var string $nickname 外号 */ public $nickname; /** * @var object $head hero类的一个实例的下一个对象 */ public $next; function __construct($id = '', $name = '', $nickname = '') { $this->id = $id; $this->name = $name; $this->nickname = $nickname; } } /** * 添加水浒英雄 * @param object $head Heros类的空对象(栈顶) * @param object $hero Heros类的一个实例 */ function addHero($head, $hero) { //定义一个当前实例,先初始化 $current = $head; //定义一个变量代表是否是重复值 $flag = false; while($current->next != null) { if($current->next != null){ break; } else if($current->next->id = $hero->next->id) { $flag = true; } $current = $current->next; } if(!$flag) { $hero->next = $current->next; $current->next = $hero; } } /** * 修改英雄信息 * @param object $head Heros类的空对象(栈顶) * @param object $hero Heros类的一个实例 */ function updateHero($head, $hero) { $current = $head; while($current->next != null) { if($current->next->id = $hero->id) { break; } $current = $current->next; } if($current->next == null) { echo '您要修改的编号为'.$hero->id.'的英雄不存在!'; } else{ $current->next->name = $hero->name; $current->next->nickname = $hero->nickname; } } /** * 删除某个英雄 * @param object $head Heros类的空对象(栈顶) * @param int $id 英雄编号 */ function delHero($head, $id) { $current = $head; while($current->next != null) { if($current->next->id = $id) { $flag = true; break; } $current = $current->next; } if(!$flag) { $current->next = $current->next->next; } else{ echo '您要删除的编号为'.$hero->id.'的英雄不存在!'; } } /** * 显示英雄排行榜 * @param object $head Heros类的空对象(栈顶) */ function showHeros($head) { $current = $head; while($current->next != null) { echo '第'.$current->next->id.'位,姓名:'.$current->next->name.'外号:'.$current->next->nickname.'<br/>'; $current = $current->next; } } $head = new Heros(); $h1 = new Heros(1,'宋江','及时雨'); addHero($head,$h1); $h2 = new Heros(2,'卢俊义','玉麒麟'); addHero($head,$h2); $h3 = new Heros(3,'吴用','智多星'); addHero($head,$h3); showHeros($head); ?>
一、内存分配(c)
因为php底层是c
用上面的例子来说:
关于内存分配的一点说明:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
一般来说:内存分配根据以下规则:
(1)基本数据类型一般放在栈区
(2)复合数据类型一般放在堆区
二、案例说明:
对象实例化的数据在堆区,但其名称在栈区,其结构如下:
相关文章推荐
- 学点PYTHON基础的东东--数据结构,算法,设计模式---单向链表
- 【学习笔记】数据结构与算法基础学习:链表
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- php学习第一章:PHP基础语法(一)之PHP数据类型与PHP常量
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- [数据结构算法学习] 单向链表
- 【算法学习笔记】08.数据结构基础 二叉树初步练习1
- 【数据结构与算法】链表1:单向链表(Java实现)
- php程序员学习javascript:第一章:javascript基本语法:数据类型
- 在emacs中用gdb调试学习算法与数据结构基础(1)_猜价格游戏
- 【算法学习笔记】09.数据结构基础 二叉树初步练习2
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- java 数据结构与算法第一章学习
- .net 数据结构与算法基础:泛型链表使用
- 数据结构和算法学习(5)-链表
- 【算法学习笔记】09.数据结构基础 二叉树初步练习2
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- 【数据结构&算法】数据结构之单向链表(练习)
- php学习第一章:PHP基础语法(二)之PHP运算
- 数据结构与算法学习笔记之写链表代码的正确姿势(下)