[英]Splstack how it's works? and why?
<?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
SplStack 實現了接口 ArrayAccess,使得 SplStack 類具有數組特性: http ://php.net/manual/en/class.arrayaccess.php
堆棧:在下推堆棧中只允許兩種操作:將項目推入堆棧,並將項目彈出堆棧。 堆棧是一種訪問受限的數據結構 - 元素只能在堆棧頂部添加和刪除。 push 將一個項目添加到堆棧的頂部,pop 從頂部刪除該項目。 一個有用的比喻是想想一堆書; 您可以只刪除頂部的書,也可以在頂部添加新書。
排隊:排隊的一個很好的例子是加州大學美食廣場的一排學生。 在隊列后面添加新的一行,而刪除(或服務)發生在前面。 在隊列中只允許入隊和出隊兩個操作。 Enqueue 意味着將一個 item 插入到隊列的后面,dequeue 意味着移除前面的 item。 該圖演示了 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
小心有人升有人降
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.