[英]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.