【算法】实现特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

问题:

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.

【要求】

1,pop,push,getMin操作的时间复杂度都是O(1)。

2,设计的栈类型可以使用现成的栈结构

 

 

思路:

准备两个栈,一个是data栈,一个是min栈

data栈每压入一个数,如果data栈压入的是第一个元素,那么min栈直接也压入这个元素。

如果data栈本来就有元素,再压入一个数,那么min栈的栈顶跟该数比较,如果该数小于min栈顶那么min栈压入该数,\

如果该数大于min栈顶,那么min栈重新压入一次min栈顶

如下图:

 

代码:

class  Getminstack{

    public function __construct()
    {
        $this->datastack=new SplStack();//php内置实现的栈类
        $this->minstack=new SplStack();//php内置实现的栈类

    }


    public function push($data){
        $minstack=$this->minstack;
        $datastack=$this->datastack;
        if($this->datastack->isEmpty()){
            $datastack->push($data);
            $minstack->push($data);
            return;
        }
        $minstacktop=$minstack->top();//获取栈顶元素
        $datastack->push($data);
        $minstacktop<$data?$minstack->push($minstacktop):$minstack->push($data);

    }

    public function pop(){
        $minstack=$this->minstack;
        $datastack=$this->datastack;
        if($datastack->isEmpty()){
            throw  new Exception("没有东西给你榨了,兄弟");
        }
        $minstack->pop();
        return $datastack->pop();


    }


    public function getmin(){
        $minstack=$this->minstack;
        return $minstack->top();
    }


}

$b=new Getminstack();
$b->push(5);
$b->push(9);
$b->push(3);
$b->push(6);
$b->push(8);

var_dump($b->getmin());//3
$b->pop();
$b->pop();
$b->pop();
var_dump($b->getmin());//5

 

posted @ 2018-07-29 14:46  丰study  阅读(191)  评论(0)    收藏  举报