《剑指offer》面试题21—包含min函数的栈

题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min。要求push,min,pop时间都是O(1)。

思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素;min函数直接取辅助栈栈顶元素即可;有元素弹出时辅助栈元素也弹出,这样栈顶就是剩下的元素中的最小的了。

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 template<typename T>
 6 class StackWithMin
 7 {
 8 public:
 9     void Push(const T& element);
10     T Min();
11     void Pop();
12 
13 private:
14     stack<T> stack_data;
15     stack<T> stack_min;
16 };
17 
18 template<typename T> void StackWithMin<T>::Push(const T& element)  //类后面的那个T太容易忘了。。
19 {
20     if(stack_data.empty())
21     {
22         stack_data.push(element);
23         stack_min.push(element);
24     }
25     else
26     {
27         stack_data.push(element);
28         T temp = stack_min.top();
29         if(element < temp)
30             stack_min.push(element);
31         else
32             stack_min.push(temp);
33     }
34 }
35 
36 template <typename T> T StackWithMin<T>::Min()
37 {
38     if(stack_data.empty())      //这里一开始忘记检查是否为空了!
39     {
40         cout<<"Empty Stack!"<<endl;
41         //return;   这里应该要assert一下
42     }
43     return stack_min.top();
44 }
45 
46 template <typename T> void StackWithMin<T>::Pop()
47 {
48     if(stack_data.empty())      //这里一开始忘记检查是否为空了!
49     {
50         cout<<"Empty Stack!"<<endl;
51         return;
52     }
53     stack_data.pop();
54     stack_min.pop();
55 }
56 
57 
58 int main()
59 {
60     StackWithMin<int> s;
61     s.Push(3);
62     s.Push(3);
63     s.Push(4);
64     s.Push(2);
65     s.Push(1);
66     cout<<s.Min()<<endl;
67     s.Pop();
68     cout<<s.Min()<<endl;
69     s.Pop();
70     cout<<s.Min()<<endl;
71     s.Pop();
72     cout<<s.Min()<<endl;
73     s.Pop();
74     s.Push(0);
75     cout<<s.Min()<<endl;
76     s.Pop();
77     cout<<s.Min()<<endl;
78     s.Pop();
79   //  cout<<s.Min()<<endl;
80     s.Pop();
81     s.Pop();
82     return 0;
83 }
View Code
原文地址:https://www.cnblogs.com/CnZyy/p/3308492.html