题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
在该栈中,调用min,push及pop的时间复杂度都是O(1).
这一题实际上需要一个辅助栈存储最小值:
1.在模板类定义两个栈类型私有成员变量,一个为保存数据的栈另外一个为保存最小值的栈
2.当栈为空的时候直接将数据同时压入数据栈和最小值栈
3.当栈不为空的时候,将数据先压入数据栈同时比较该数据和最小值栈栈顶元素的大小
若大于最小值栈栈顶元素,则向最小值栈压入其栈顶元素,否则压入该数据到最小值栈
栈顶
4.当我们使用方法的时候直接取最小值的栈顶即为栈中的最小值
5.当我们要pop栈的时候应同时pop最小值栈的栈顶元素
代码实现如下:
MinStack.h
1 #ifndef _MINSTACK_H 2 #define _MINSTACK_H 3 4 #include <stack> 5 using namespace std; 6 7 template <typename T> 8 class StackWithMin 9 { 10 public: 11 void push(T data); 12 void pop(); 13 T min(); 14 private: 15 stack<T> DataStack; 16 stack<T> MinStack; 17 }; 18 19 template <typename T> void StackWithMin<T>::push(T data) 20 { 21 DataStack.push(data); 22 if(MinStack.empty()) 23 { 24 MinStack.push(data); 25 } 26 else 27 { 28 if(data>=MinStack.top()) 29 { 30 MinStack.push(MinStack.top()); 31 } 32 else 33 { 34 MinStack.push(data); 35 } 36 } 37 } 38 39 template <typename T> void StackWithMin<T>::pop() 40 { 41 MinStack.pop(); 42 DataStack.pop(); 43 } 44 45 template <typename T> T StackWithMin<T>::min() 46 { 47 if(!DataStack.empty()) 48 { 49 return MinStack.top(); 50 } 51 else 52 { 53 cout<<"不好意思栈空!"<<endl; 54 } 55 } 56 57 #endif
测试函数:
1 #include "MinStack.h" 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 StackWithMin<int> MinStack; 8 cout<<"请输入依次压入栈的数据(0-exit): "<<endl; 9 int data; 10 while(data!=0) 11 { 12 cin>>data; 13 if(data!=0) 14 MinStack.push(data); 15 } 16 cout<<endl; 17 cout<<"栈的最小值为: "<<MinStack.min()<<endl;; 18 19 return 0; 20 }
运行截图: