1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <vector>
5 using namespace std;
6
7 template<typename T>
8 class StackWithStack
9 {
10 public:
11 /// 构造函数
12 StackWithStack() {}
13 /// 析构函数
14 ~StackWithStack() {}
15
16 /// top操作
17 T &top()
18 {
19 return mData.back();
20 }
21
22 /// top操作
23 const T &top() const
24 {
25 return mData.back();
26 }
27
28 /// push操作
29 void push(const T &value)
30 {
31 mData.push_back(value);
32
33 /// 这里就将最小的元素下表放入下标数组中
34 if (mMinIndex.size() == 0) // 空数组
35 {
36 mMinIndex.push_back(0);
37 }
38 else
39 {
40 /// 使mData的size和mMinIndex的size相等
41 if (value < mData[mMinIndex.back()])
42 {
43 mMinIndex.push_back(mData.size() - 1);
44 }
45 else
46 {
47 mMinIndex.push_back(mMinIndex.back()); // 添加最后一个最小的下标,防止pop的时候删除有效元素
48 }
49 }
50 }
51
52 /// pop操作,把元素弹出,同时把下标也弹出
53 void pop()
54 {
55 mData.pop_back();
56 mMinIndex.pop_back();
57 }
58
59 /// 获取最小元素
60 const T &min() const
61 {
62 assert(mData.size() > 0);
63 assert(mMinIndex.size() > 0);
64
65 return mData[mMinIndex.back()];
66 }
67
68
69 private:
70 vector<T> mData;
71 vector<size_t> mMinIndex;
72 };
73
74 /// 测试
75 int main()
76 {
77 StackWithStack<size_t> stack;
78 stack.push(3);
79 printf("%d\n", stack.min());
80
81 stack.push(4);
82 printf("%d\n", stack.min());
83
84 stack.push(2);
85 printf("%d\n", stack.min());
86
87 stack.push(1);
88 printf("%d\n", stack.min());
89
90 stack.pop();
91 printf("%d\n", stack.min());
92
93 stack.pop();
94 printf("%d\n", stack.min());
95
96 stack.push(0);
97 printf("%d\n", stack.min());
98
99 #ifdef _DEBUG
100 system("pause");
101 #endif;
102
103 return EXIT_SUCCESS;
104 }