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 }