[英]splstack push and add
如果我們一起使用推和加法,如何計算堆棧
$stack = new SplStack();
$stack[] = 'one2';
$stack[] = 20152;
$stack[] = 'two2';
echo "<pre>";
print_r($stack);
$stack->add(0, 'one');
$stack->add(1, 'two');
$stack->add(2, '2015');
echo "<pre>";
print_r($stack);
我在結果中看到了這一點,但無法確定第二部分。
第一個print_r的結果:
SplStack Object
(
[flags:SplDoublyLinkedList:private] => 6
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => one2
[1] => 20152
[2] => two2
)
)
第二個print_r的結果:
SplStack Object
(
[flags:SplDoublyLinkedList:private] => 6
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => one2
[1] => 20152
[2] => 2015
[3] => two
[4] => one
[5] => two2
)
)
我也花了一些時間來解決這個問題,但是這種行為是正確的。 最好使用列表索引而不是內部數組的print_r
查看列表。 此代碼將執行以下操作:
for ($i = 0; $i < $stack->count(); $i++) {
echo "index $i contains " . $stack->offsetGet($i) . "\n";
}
請注意,索引0代表列表的頂部(即$stack->pop()
將返回的內容)。 這是您的初始代碼塊之后的樣子:
index 0 contains two2
index 1 contains 20152
index 2 contains one2
這是因為$stack[] = x
等效於$stack->push(x)
。
現在查看下一個代碼塊:
$stack->add(0, 'one');
如果我們看一下add
的手冊 ,它會說:
在指定的索引處插入值newval,將該索引處的先前值(和所有后續值)重新排列到列表中。
由於列表的頂部是索引0,因此必須將添加項中的值插入索引1,以便可以將“索引0”中的現有值“改組為列表”,即必須保留在索引0處。執行此代碼后,列表的轉儲將顯示以下內容:
index 0 contains two2
index 1 contains one
index 2 contains 20152
index 3 contains one2
其他add
發生相同的事情,它們必須向下一個索引向下移動,以便列表中位於它們前面的值保持該狀態。 因此,在另外兩個添加之后,列表如下所示:
index 0 contains two2
index 1 contains one
index 2 contains two
index 3 contains 2015
index 4 contains 20152
index 5 contains one2
如果您嘗試將所有內容從堆棧中彈出:
while ($stack->count()) {
echo $stack->pop() . "\n";
}
你得到:
two2
one
two
2015
20152
one2
注意 :如果要在列表的頂部添加一個值,則必須使用unshift(value)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.