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++水平不足,以后还得不断习练才行。