目标:构建一个栈,以O(1)的时间复杂度返回栈内数据的最小值。
方法:用两个栈实现,一个存放原数据,一个存放最小值。对于原数据栈按普通的栈规则进行出栈入栈,对于最小值栈则按照
入栈规则
1、如果栈为空直接将当前的输入数入栈;
2、如果输入数小于等于最小值栈栈顶元素的值,那么将该输入数入栈;
出栈规则
1、如果原数据栈弹出的元素等于最小值栈顶的元素,那么最小值栈顶的元素也弹出;
2、如果不等,则不处理最小栈
(理由是最小栈中栈顶元素的意义是原数据栈当前的最小,因此原数据栈栈顶的元素值只可能小于等于最小栈栈顶元素值)
代码:
class Solution{
public:
void push(int num){
source.push(num);
if(minvalue.empty())
minvalue.push(num);
else if(num <= minvalue.top())
minvalue.push(num);
}
void pop(){
if(source.empty()){
cout<<"Your stack is empty !!"<<endl;
return;
}
if(source.top() == minvalue.top())
minvalue.pop();
source.pop();
}
int top(){
if(source.empty()){
cout<<"your stack is empty !!"<<endl;
return -1;
}
return source.top();
}
int getMin(){
if(minvalue.empty()){
cout<<"You stack is empty !!"<<endl;
return -1;
}
return minvalue.top();
}
private:
stack<int> source;//原数据栈
stack<int> minvalue;//最小值栈
};