剑指Offer19 包含min函数的栈

 1 /*************************************************************************
 2     > File Name: 19_MinInStack.cpp
 3     > Author: Juntaran
 4     > Mail: JuntaranMail@gmail.com
 5     > Created Time: 2016年08月30日 星期二 19时29分48秒
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 #include <bits/stdc++.h>
10 
11 using namespace std;
12 
13 template<class T>
14 class minStack
15 {
16 private:
17     stack<T> stack_data;
18     stack<T> stack_min;
19     
20 public:
21 
22     void push(T &value)
23     {
24         // 新元素入栈
25         stack_data.push(value);
26         
27         // 新元素比之前最小元素小的时候,新元素进入辅助栈
28         // 否则把之前最小元素重复插入辅助栈
29         if (stack_min.size()==0 || value<stack_min.top())
30             stack_min.push(value);
31         else
32             stack_min.push(stack_min.top());
33     }
34     T pop()
35     {
36         assert(stack_data.size()>0 && stack_min.size()>0);
37         stack_data.pop();
38         stack_min.pop();
39         return stack_data.top();
40     }
41     T min()
42     {
43         assert(stack_data.size()>0 && stack_min.size()>0);
44         return stack_min.top();
45     }
46 };
47 
48 int main()
49 {
50     minStack<int> mStack;
51     for (int i = 0; i < 5; i++)
52     {
53         cout << i << " push" << endl;
54         mStack.push(i);
55     }
56     cout << "min is " << mStack.min() << endl;
57     for (int i = 1; i < 3; i++)
58     {
59         cout << mStack.pop() << " pop" << endl;
60     }
61     cout << "min is " << mStack.min() << endl;
62     for (int i = 5; i < 7; i++)
63     {
64         cout << i << " push" << endl;
65         mStack.push(i);
66     }
67     cout << "min is " << mStack.min() << endl;
68     for (int i = 1; i < 3; i++)
69     {
70         cout << mStack.pop() << " pop" << endl;
71     }
72     int k = -1;
73     mStack.push(k);
74     cout << "min is " << mStack.min() << endl;
75     cout << endl;
76 }

 

posted @ 2016-08-30 20:27  Juntaran  阅读(155)  评论(0编辑  收藏  举报