题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数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 }