Splstack它是如何工作的?为什么?

时间:2015-10-20 12:22:38

标签: php spl

<?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 

2 个答案:

答案 0 :(得分:1)

SplStack实现了ArrayAccess接口,导致SplStack类具有数组功能: http://php.net/manual/en/class.arrayaccess.php

答案 1 :(得分:0)

堆栈: 在下推式堆栈中,仅允许执行两项操作:将项目推入堆栈,然后将项目弹出堆栈。堆栈是访问受限的数据结构-只能在顶部从堆栈中添加和删除元素。推将项目添加到堆栈的顶部,弹出将项目从顶部移除。一个有用的类比是想一堆书。您可以只删除最重要的书,也可以在最上面添加新书。

stack

队列: 排队的一个很好的例子是加州大学食堂里的一群学生。在队列的末尾添加新行,而在队列的最前面进行删除(或投放)。在队列中,仅允许两个操作入队和出队。入队意味着将项目插入队列的后部,出队意味着移除前项。图片演示了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

请注意有人升序有人

how works stack another example

how works queue