题目描述:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
解题思路:
使用一个辅助栈,里面存的目前栈中的最小值
代码实现:
1 class GetMin 2 { 3 public: 4 void PushData(int a) 5 { 6 Data.push(a); 7 if (Min.empty()) 8 Min.push(a);//当还未存数时,目前栈中的最小值就是第一个数 9 else 10 Min.push(Min.top() <= a ? Min.top() : a); 11 //将新加入的数与栈中的最小值相比,存入新的最小值,以维持Data与Min栈的高度一样 12 } 13 14 int GetTop() 15 { 16 if(Data.size()) 17 return Data.top(); 18 return -1; 19 } 20 21 int theMin() 22 { 23 if (Data.size()) 24 return Min.top(); 25 return -1; 26 } 27 28 void PopData() 29 { 30 if (Data.size()) 31 { 32 Data.pop(); 33 Min.pop(); 34 } 35 } 36 37 private: 38 stack<int>Data; 39 stack<int>Min; 40 }; 41 42 void Test() 43 { 44 GetMin ss; 45 ss.PushData(6); 46 cout << ss.theMin() << endl; 47 ss.PushData(5); 48 cout << ss.theMin() << endl; 49 ss.PushData(2); 50 cout << ss.theMin() << endl; 51 ss.PushData(1); 52 cout << ss.theMin() << endl; 53 ss.PushData(3); 54 cout << ss.theMin() << endl; 55 ss.PushData(6); 56 cout << ss.theMin() << endl; 57 58 ss.PopData(); 59 cout << ss.theMin() << endl; 60 ss.PopData(); 61 cout << ss.theMin() << endl; 62 ss.PopData(); 63 cout << ss.theMin() << endl; 64 ss.PopData(); 65 cout << ss.theMin() << endl; 66 67 }