<?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
答案 0 :(得分:1)
SplStack实现了ArrayAccess接口,导致SplStack类具有数组功能: http://php.net/manual/en/class.arrayaccess.php
答案 1 :(得分:0)
堆栈: 在下推式堆栈中,仅允许执行两项操作:将项目推入堆栈,然后将项目弹出堆栈。堆栈是访问受限的数据结构-只能在顶部从堆栈中添加和删除元素。推将项目添加到堆栈的顶部,弹出将项目从顶部移除。一个有用的类比是想一堆书。您可以只删除最重要的书,也可以在最上面添加新书。
队列: 排队的一个很好的例子是加州大学食堂里的一群学生。在队列的末尾添加新行,而在队列的最前面进行删除(或投放)。在队列中,仅允许两个操作入队和出队。入队意味着将项目插入队列的后部,出队意味着移除前项。图片演示了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
请注意有人升序有人