包含min函数的栈

来源:互联网 发布:马甲线软件 编辑:程序博客网 时间:2024/04/30 01:53

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数,

调用min,push,pop的时间复杂度为O(1)。

思路:多加一个辅助栈m_min来完成min函数的操作。每次压元素入栈时,判断其与m_min当前最小元素的大小,大则再压栈m_min顶元素入栈一次,小则将该元素压入。

这样可以多次实现min函数功能。若只是添加一个变量来保存最小值,pop一次之后就无法执行min函数。

#include <stack>#include <assert.h>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();}template <typename T> T& StackWithMin<T>::top(){    return m_data.top();}template <typename T> const T& StackWithMin<T>::top() const{    return m_data.top();}template <typename T> bool StackWithMin<T>::empty() const{    return m_data.empty();}template <typename T> size_t StackWithMin<T>::size() const{    return m_data.size();}
同时考察对模版、泛型、类的理解。
int main(){//定义对象,注意标明类型:如intStackWithMin<int> swm;swm.push(1);swm.push(4);swm.push(3);swm.push(2);swm.push(5);std::cout << swm.top() << std::endl;std::cout << swm.min() << std::endl;std::cout << swm.size() << std::endl;swm.pop();std::cout << swm.top() << std::endl;std::cout << swm.min() << std::endl;std::cout << swm.size() << std::endl;return 0;}


原创粉丝点击