数据结构练习(02)设计包含min函数的栈

http://zhedahht.blog.163.com/blog/static/25411174200712895228171/

基本上是把代码抄了一遍,中间也查阅和理解了不少东西。

这里的思想和编程之美上面的稍有不同,编程之美上面给出的解法是涉及一个最小值的链,而这次的思路是涉及一个对应的栈,如果push的不是最小值,则把以前的坐标压栈。

#include <deque>
#include <cassert>

template <typename T> class CStackWithMin 
{
public:
    CStackWithMin(void) {}
    virtual ~CStackWithMin(void) {}

    T& top(void);
    const T& top(void) const;

    void push(const T& value);
    void pop(void);

    const T& min(void) const;

private:
    deque<T> m_data;
    deque<size_t> m_minIndex;
};

template <typename T> T& CStackWithMin<T>::top()
{
    return m_data.back();
}

template <typename T> const T& CStackWithMin<T>::top() const
{
    return m_data.back();
}

template <typename T> void CStackWithMin<T>::push(const T& value)
{
    m_data.push_back(value);

    if (m_minIndex.size() == 0)
        m_minIndex.push_back(0);
    else
    {
        if (value < m_data[m_minIndex.back()])
            m_minIndex.push_back(m_data.size() - 1);
        else
            m_minIndex.push_back(m_minIndex.back());
    }
}

template <typename T> void CStackWithMin<T>::pop()
{
    m_data.pop_back();
    m_minIndex.pop_back();
}

template <typename T> const T& CStackWithMin<T>::min() const
{
    assert(m_data.size() > 0);
    assert(m_minIndex.size() > 0);

    return m_data[m_minIndex.back()];
}

感叹自己的C++水平不足,以后还得不断习练才行。

posted @ 2012-12-11 15:12  kedebug  阅读(208)  评论(0编辑  收藏  举报