剑指 Offer 09. 用两个栈实现队列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
著作权归领扣网络所有。
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
第一版
class CQueue {
private $stack1 = [];
private $stack2 = [];
/**
*/
function __construct() {
}
/**
* @param Integer $value
* @return NULL
*/
function appendTail($value) {
array_push($this->stack1, $value);
}
/**
* 数据放置栈1中,栈2为辅助空间
* @return Integer
*/
function deleteHead() {
//栈1有元素就放置到栈2中
while ($this->stack1) {
array_push($this->stack2, array_pop($this->stack1));
}
//删除头节点
$res = -1;
if ( $this->stack2 ) {
$res = array_pop($this->stack2);
}
//然后再把元素放入到栈1中
while ($this->stack2) {
array_push($this->stack1, array_pop($this->stack2));
}
return $res;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* $obj = CQueue();
* $obj->appendTail($value);
* $ret_2 = $obj->deleteHead();
*/
改进版
class CQueue {
private $stack1 = [];
private $stack2 = [];
/**
*/
function __construct() {
}
/**
* @param Integer $value
* @return NULL
*/
function appendTail($value) {
array_push($this->stack1, $value);
}
/**
* 栈1 入栈,栈2 出栈
* @return Integer
*/
function deleteHead() {
//栈2为空时,栈1有元素,先把栈1的元素全部移到栈2
//栈2有值时,直接从顶部剔除元素,减少移动
if (empty($this->stack2) && $this->stack1) {
while ($this->stack1) {
array_push($this->stack2, array_pop($this->stack1));
}
}
//删除栈2的top元素
$res = -1;
if ( $this->stack2 ) {
$res = array_pop($this->stack2);
}
return $res;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* $obj = CQueue();
* $obj->appendTail($value);
* $ret_2 = $obj->deleteHead();
*/