2019-06-01 09:10:22 2003次浏览 1条回答 1 悬赏 100 金钱
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,10100100010000100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。

那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。

栈内存是可以直接存取的,而堆内存是 不可以直接存取的内存。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可 以使用对象了。$p1 就是我们实例出来的对象名称,同理,$p2$p3 也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每 个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体 现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。
补充于 2019-06-01 10:57

112013201495816.jpg
112044015715317.jpg

最佳答案

  • 发布于 2019-06-01 11:40 举报

    对于 php 这样一种不能直接操作内存的 解释型语言来说,强行区分 堆内存和栈内存的意义 并不大。
    用普通意义上 堆栈的概念来解释php 也是 有风险的,这取决于 php 底层的实现
    如果你贴一段 php底层的 c代码,底下配上 关于堆栈的说明 是合适的,而一段 php 代码 配上堆栈的说明 中间就 缺少了 最重要的 一个环节

    1 条回复
    回复于 2019-06-01 14:34 回复

    大佬,问一下,php是不是在申请内存的时候申请一块来用,如果运行过程中不够用了就会再多申请一些扩大申请的内存容量。是不是只有在php程序结束才会释放掉申请的内存?如果php执行不结束或不停的扩大内存申请就可以弄出内存益处的情况了?

    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
灰太狼
副总裁

灰太狼

注册时间:2016-11-19
最后登录:2023-07-14
在线时长:76小时17分
  • 粉丝28
  • 金钱3290
  • 威望150
  • 积分5550

热门问题