【问题标题】:Splstack how it's works? and why?Splstack 它是如何工作的?为什么?
【发布时间】:2016-01-19 02:35:40
【问题描述】:
<?php
    $stack = new SplStack();

    $stack->add(0, 'one');
    $stack->add(1, 'two');
    $stack->add(2, '2015');

    echo "<pre>";
    print_r($stack);

当我运行此代码时,所有项目都存储一个名为dllist(我希望)的属性,这是预期的结果。

SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => one
            [1] => two
            [2] => 2015
        )

)

但是我运行下面的代码,工作方式与上面的代码相同,为什么当我尝试时,$stack[] = 'one'; 为什么没有出错? php如何知道$stack[] = 'one';应该存储在dllist中?

<?php
    $stack = new SplStack();

    $stack[] = 'one';
    $stack[] = 2015;
    $stack[] = 'two';

    echo "<pre>";
    print_r($stack);

我预计会出现类似以下语句的错误:

<?php

    $int = 2015;
    $int[] = 300; //Warning: Cannot use a scalar value as an array in 

    $str = 'foo';
    $str[] = 'foo'; //Fatal error: [] operator not supported for strings in

    $obj = new stdClass(); 
    $obj[] = 'new one'; //Fatal error: Cannot use object of type stdClass as array in 

【问题讨论】:

  • 因为堆栈不仅仅是一个替代数组,它是一个非常特殊的 FILO(先进后出)数据结构。虽然它可能与数组共享一些功能,但它应该用作堆栈,而不仅仅是数组
  • @MarkBaker,这个$stack[] = 'one'; 工作是因为SplStack 实现了arrayAcess
  • 是的,但是$stack[] = 'one'; 等效于$stack-&gt;push('one'),而不是$stack-&gt;add(0, 'one');.... 后者是专门为在dll 内的固定点注入值而实现的,将剩余部分改组堆栈的必要性....并且使用 push 效率更高,除非您需要操作堆栈中已经存在的值
  • 提问有什么问题?

标签: php spl


【解决方案1】:

堆栈: 在下推堆栈中,只允许两种操作:将项目推入堆栈,并将项目从堆栈中弹出。堆栈是一种访问受限的数据结构——元素只能在堆栈顶部添加和删除。 push 将项目添加到堆栈顶部,pop 从顶部删除项目。一个有用的类比是想一摞书。您可以只删除最上面的书,也可以在顶部添加新书。

队列: 排队的一个很好的例子是加州大学美食广场的一排学生。新添加到队列后面的行,而移除(或服务)发生在前面。在队列中,只有两个操作允许入队和出队。入队意味着将一个项目插入队列的后面,出队意味着删除前面的项目。图片展示了 FIFO 访问。堆栈和队列之间的区别在于移除。在堆栈中,我们删除最近添加的项目;在队列中,我们删除最近最少添加的项目。!

例如栈

顶部的最后一个推送元素

后进先出 (LIFO)


$q = new SplStack();

$q[] = 1;
$q[] = 2;
$q[] = 3;
$q->push(4);
$q->add(4,5);

$q->rewind();
while($q->valid()){
    echo $q->current(),"\n";
    $q->next();
}
?>

Output
5
4
3
2
1

例如队列

底部的最后一个推送元素

先进先出 (FIFO)


<?php 


// Create a new empty queue 

$gfg = new SplQueue(); 



$gfg[] = 1; 

$gfg[] = 2; 

$gfg[] = 3; 


// Dequeue element 

echo $gfg->dequeue() . "\n"; 

echo $gfg->dequeue() . "\n"; 


?> 
Output:
1
2

小心某人升有人降

【讨论】:

    【解决方案2】:

    SplStack 实现了 ArrayAccess 接口,使 SplStack 类具有数组特性: http://php.net/manual/en/class.arrayaccess.php

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2020-08-06
      • 2012-11-06
      • 2018-09-05
      相关资源
      最近更新 更多