如何直接从数组创建PHP的SplStack?
如何直接从数组创建PHP的SplStack?
嘿,这个问题我之前也纠结过!其实不用自己写循环push的函数,SplStack的父类SplDoublyLinkedList提供了addAll方法可以批量添加元素,不过要注意栈的顺序问题——因为SplStack默认是**后进先出(LIFO)**的模式,直接用addAll会和你循环push的结果顺序相反,我给你两种靠谱的解决办法:
方法一:反转数组后批量添加
因为addAll是把元素依次加到链表的尾部,而SplStack的push是把元素加到链表头部,所以先反转数组,再用addAll就能得到和循环push完全一致的栈:$array = [1, 2, 3]; $stack = new SplStack(); $stack->addAll(array_reverse($array)); // 测试一下,pop出来的顺序是3、2、1,和循环push的结果一样 echo $stack->pop(); // 输出3 echo $stack->pop(); // 输出2 echo $stack->pop(); // 输出1方法二:临时切换迭代模式
先把SplStack临时切换成队列(FIFO)模式,用addAll添加数组后再切回栈模式,这样也能保证顺序正确:$array = [1, 2, 3]; $stack = new SplStack(); // 临时切换为FIFO队列模式 $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP); $stack->addAll($array); // 切回LIFO栈模式 $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP); // 同样,pop出来的顺序是3、2、1 echo $stack->pop(); // 输出3
如果你完全不在乎栈内元素的顺序,那直接调用$stack->addAll($array)也可以,但大多数场景下顺序都是重要的,所以上面两种方法更实用。
备注:内容来源于stack exchange,提问作者wujido
相关产品推荐
相关产品推荐

