包含max(min)的栈及队列

来源:互联网 发布:java Object not found 编辑:程序博客网 时间:2024/06/06 17:00

题目一:设计一种栈,在这个栈中实现一个能够得到栈中最小元素的min函数。在该栈中,调用pushpopmin的时间复杂度都是O(1)

       可以设计一个栈作为辅助数据结构,这个栈相应位置的值就是主栈中压入相应多元素中的最大值。两个栈保持同等的数据量。辅助栈的目的就是记录主栈拥有相应多个元素时的最大值。

template <typename T> class StackWithMin{public:    StackWithMin(void) {}    virtual ~StackWithMin(void) {}    T& top(void);    const T& top(void) const;    void push(const T& value);    void pop(void);    const T& min(void) const;    bool empty() const;    size_t size() const;private:    std::stack<T>   m_data;     // 数据栈,存放栈的所有元素    std::stack<T>   m_min;      // 辅助栈,存放栈的最小元素};template <typename T> void StackWithMin<T>::push(const T& value){    // 把新元素添加到辅助栈    m_data.push(value);    // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;    // 否则把之前的最小元素重复插入辅助栈里    if(m_min.size() == 0 || value < m_min.top())        m_min.push(value);    else        m_min.push(m_min.top());}template <typename T> void StackWithMin<T>::pop(){    assert(m_data.size() > 0 && m_min.size() > 0);    m_data.pop();    m_min.pop();}template <typename T> const T& StackWithMin<T>::min() const{    assert(m_data.size() > 0 && m_min.size() > 0);    return m_min.top();}

题目二:设计一个有min操作的队列,其pushpopmin的操作复杂度都为1

       其实这个题目就是用两个栈来实现队列,可以用上述的两个StackWithMin来实现这个QueueWithMin,其实底层用了4个基本的stack

template <typename T> class QueueWithMin{public:    QueueWithMin(void) {}    ~QueueWithMin(void) {}T& top(void);    const T& top(void) const;    void push(const T& value);    void pop(void);    const T& min(void) const;    bool empty() const;    size_t size() const;private:    StackWithMin   S1;        StackWithMin   S2;     };template <typename T> void QueueWithMin::push(const T& value){S1.push(value);}template <typename T> void QueueWithMin::pop(void){if (S2.empty()){while (!S1.empty()){S2.push(S1.top());S1.pop();}}S2.pop();}template <typename T> const T& QueueWithMin::min(void) const{return S1.min()<S2.min()?S1.min():S2.min();}


        题目三:能否实现既有min又有max操作的栈?可以继续增加一个辅助栈就可以了。

原创粉丝点击