PHP 实现的双向链表,数据存放原理? [ 未指定版本 ]
class link
{
public $preLink = NULL; //前指针
public $number; //排名
public $name; //名字
public $nextLink = NULL; //后指针
//构造函数,初始化值
public function __construct($number= '', $name = '')
{
$this->number = $number;
$this->name = $name;
}
//增加数据
static public function addDom($head, $data){
$obj = $head;
$isExist = FALSE;
if(NULL == $obj->nextLink)
{
$obj->nextLink = $data;
$data->preLink = $head;
}
//找到添加的位置
while(NULL != $obj->nextLink){
if($obj->nextLink->number >$data->number){
break;
}else if($obj->nextLink->number == $data->number){
$isExist = TRUE;
echo "<br>不能添加相同的编号";
}
$obj = $obj->nextLink;
}
if(!$isExist){
if(NULL !=$obj->nextLink){
$data->nextLink =$obj->nextLink;
}
$data->preLink = $obj;
if(NULL !=$obj->nextLink){
$data->nextLink->preLink = $data;
}
$obj->nextLink = $data;
}
}
//输出链表数据
static public function showDom($head) {
$obj = $head;
while(NULL != $obj->nextLink){
echo "<br>编号:".$obj->nextLink->number."名字:".$obj->nextLink->name;
$obj = $obj->nextLink;
}
}
static public function delDom($head, $num){
$obj = $head;
$isFind = FALSE;
while(NULL != $obj){
if($obj->number == $num){
$isFind = TRUE;
break;
}
$obj = $obj->nextLink;
}
if($isFind){
if(NULL !=$obj->nextLink){
$obj->preLink->nextLink = $obj->nextLink;
echo '<br/>删除的号码是'.$obj->number;
}else{
echo "<br>没有找到目标";
}
}
}
static public function updateDom($head, $num, $name){
$obj = $head;
while(NULL != $obj){
if($obj->number == $num){
$obj->name = $name;
echo "<br/>改变号码{$obj->number}的结果:".$obj->name;
break;
}
$obj = $obj->nextLink;
}
}
}
$head = new link();
$one = new link(1,'oooooooo');
$two = new link(2,'wwwwwwww');
$three = new link(3,'eeeeeeee');
link::addDom($head,$one);
link::addDom($head,$two);
link::addDom($head,$three);
link::showDom($head);
link::delDom($head, 2);
link::showDom($head);
link::updateDom($head,3, 'kkkkkk');
link::showDom($head);
数据是存放在哪里的?是存放在堆栈里吗?
link::addDom($head,$one);
link::addDom($head,$two);
这样存不会覆盖上一个吗?
是什么样的存储原理?
灰太狼 补充于 2019-06-01 09:19
【栈】后进先出,先进后出,这就是典型的“栈”结构。
任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。
栈主要包含两个操作,入栈和出栈。
实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。
对于出栈操作来说,我们不会涉及内存的重新申请和数据的搬移,所以出栈的时间复杂度仍然是O(1)。但是,对于入栈操作来说,情况就不一样了。当栈中有空闲空间时,入栈操作的时间复杂度为 O(1)。但当空间不够时,就需要重新申请内存和数据搬移,所以时间复杂度就变成了O(n)。
PHP对象在内存堆栈中的分配
对象在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上说大体上是分为4段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明放在不同的内存段里面。
数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量
代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法
栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。
那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。
栈内存是可以直接存取的,而堆内存是 不可以直接存取的内存。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可 以使用对象了。$p1 就是我们实例出来的对象名称,同理,$p2,$p3 也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每 个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体 现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。
灰太狼 补充于 2019-06-01 10:57
最佳答案
其他 0 个回答
没有找到数据。
灰太狼
注册时间:2016-11-19
最后登录:2023-07-14
在线时长:76小时17分
最后登录:2023-07-14
在线时长:76小时17分
- 粉丝28
- 金钱3290
- 威望150
- 积分5550