建立辅助栈,存放最小元素。当新元素比之前的最小元素小时,把新元素插入辅助栈里;否则把之前的最小元素重复插入辅助栈里
1 // 《剑指Offer——名企面试官精讲典型编程题》代码 2 // 著作权所有者:何海涛 3 4 #pragma once 5 6 #include <stack> 7 #include <assert.h> 8 9 template <typename T> class StackWithMin 10 { 11 public: 12 StackWithMin(void) {} 13 virtual ~StackWithMin(void) {} 14 15 T& top(void); 16 const T& top(void) const; 17 18 void push(const T& value); 19 void pop(void); 20 21 const T& min(void) const; 22 23 bool empty() const; 24 size_t size() const; 25 26 private: 27 std::stack<T> m_data; // 数据栈,存放栈的所有元素 28 std::stack<T> m_min; // 辅助栈,存放栈的最小元素 29 }; 30 31 template <typename T> void StackWithMin<T>::push(const T& value) 32 { 33 // 把新元素添加到辅助栈 34 m_data.push(value); 35 36 // 当新元素比之前的最小元素小时,把新元素插入辅助栈里; 37 // 38 if(m_min.size() == 0 || value < m_min.top()) 39 m_min.push(value); 40 else 41 m_min.push(m_min.top()); 42 } 43 44 template <typename T> void StackWithMin<T>::pop() 45 { 46 assert(m_data.size() > 0 && m_min.size() > 0); 47 48 m_data.pop(); 49 m_min.pop(); 50 } 51 52 53 template <typename T> const T& StackWithMin<T>::min() const 54 { 55 assert(m_data.size() > 0 && m_min.size() > 0); 56 57 return m_min.top(); 58 } 59 60 template <typename T> T& StackWithMin<T>::top() 61 { 62 return m_data.top(); 63 } 64 65 template <typename T> const T& StackWithMin<T>::top() const 66 { 67 return m_data.top(); 68 } 69 70 template <typename T> bool StackWithMin<T>::empty() const 71 { 72 return m_data.empty(); 73 } 74 75 template <typename T> size_t StackWithMin<T>::size() const 76 { 77 return m_data.size(); 78 }