面试题21:包含min函数的栈

建立辅助栈,存放最小元素。当新元素比之前的最小元素小时,把新元素插入辅助栈里;否则把之前的最小元素重复插入辅助栈里

 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 }
原文地址:https://www.cnblogs.com/raichen/p/5648731.html