一、用两个栈实现队列
题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
算法思路:
栈的特性是先进后出,呈一个桶的形状,先进去的后出来。而队列则是先进先出,先排队的先获得机会。
因此,第一步,如果想用栈来实现队列,则必须需要两个栈;
第二步,要实现先进先出,则可以通过元素先入第一个栈,再把第一个栈的数据存到第二个栈,这样就实现了先进先进的目的。
算法代码:
<?php
class CQueue{
public $stack1 = null;
public $stack2 = null;
public function __construct()
{
$this->stack1 = new SplStack(); //实例化两个栈
$this->stack2 = new SplStack();
}
/**
元素入栈
*/
public function appendStack($value)
{
return $this->stack1->push($value);
}
/**
元素出栈
*/
public function deleteHead()
{
if(!$this->stack2->isEmpty()){ //如果第二个栈不为空,则元素出栈
return $this->stack2->pop();
}else{
while(!$this->stack1->isEmpty()){ //循环将第一个栈内的元素压入第二个栈
$this->stack2->push($this->stack1->pop());
}
return !$this->stack2->isEmpty() ? $this->stack2->pop() : -1;
}
}
}
$obj = new CQueue();
$obj->appendStack(5);
$obj->appendStack(4);
$obj->appendStack(3);
$result = $obj->deleteHead();
print_r($result);
?>
二、包含min函数的栈
题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
算法思路:
栈内的元素出入都必须遵照先进后出的严格顺序,那么想在复杂度1的情况下获得栈内元素的最小值,则可考虑借助一个辅助栈来实现。在元素入栈的时候,就选择性的将最小元素压入辅助栈内。
算法代码:
<?php
class MinStack {
public $stack1 = []; //数据栈
public $stack2 = []; //辅助栈
/**
* initialize your data structure here.
*/
function __construct() {
}
/**
* @param Integer $x
* @return NULL
*/
function push($x) {
$this->stack1[] = $x; //数据存放到数据栈内
if(empty($this->stack2)){ //如果辅助栈为空,则第一个元素存入辅助栈
$this->stack2[] = $x;
}else if($x <= end($this->stack2)){ //如果辅助栈不为空,且当前入栈的元素值小于辅助栈的第一个元素,则将其也存入辅助栈
$this->stack2[] = $x;
}
}
/**
* @return NULL
*/
function pop() {
if(empty($this->stack1)){ //若数据栈为空,则返回
return ;
}
$x = array_pop($this->stack1); //数据库栈 元素出栈
if($x <= end($this->stack2)){ //出栈时,如果元素是最小值,则辅助栈也要出栈。
array_pop($this->stack2);
}
}
/**
* @return Integer
*/
function top() {
return end($this->stack1); //直接返回数据栈栈顶元素
}
/**
* @return Integer
*/
function min() {
return end($this->stack2); //直接返回辅助栈栈顶元素
}
}
$obj = new MinStack();
$obj->push(-2);
$obj->push(0);
$obj->push(-3);
$res1 = $obj->min();
$obj->pop();
$res3 = $obj->top();
$res4 = $obj->min();
echo $res1."\n";
echo $res3."\n";
echo $res4."\n";
?>
如果有更优解法,欢迎大家讨论!!