思路整理自剑指Offer
一:题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
二:解题思路
刚看时读题,并没有很清楚的理解题目的意思,看了解析后才明白,题目的意思可简单理解为:
一批数据入栈后,你可以获得这批数据的最小值,可以更改push(),pop(),top()函数和新建的min()函数实现
可以借助辅助栈,利用空间换时间,实现时间复杂度为O(1)的方法
以例子说明,加入将3,4,2,1压栈,求栈中元素最小值
定义一个辅助栈,与原始栈同时出栈入栈,区别在于辅助栈每次都把最小值压入栈,那么就可以保证,辅助栈栈顶一直都是最小元素。
三:代码实现
class Solution {
public:
//需要自己定义栈,以及辅助栈
stack<int> data; //存放数据
stack<int> min_data; //存放data中的最小值,min_data大小等于data大小
void push(int value) {
//新元素入栈
data.push(value);
//如果min_data为空,新元素入栈
if(min_data.size()==0)
min_data.push(value);
//如果min_data不为空否则,
else{
//value小于min_data栈顶元素,入栈,
if(value<=min_data.top())
min_data.push(value);
else{
//value小于min_data栈顶元素,说明当前min_data的栈顶元素是data中的最小值,再将min_data栈顶元素入栈
int topValue=min_data.top();
min_data.push(topValue);
}
}
}
//弹栈,获得栈顶元素,获得栈的最小值,都是对原始栈而言的
void pop() {
data.pop();
min_data.pop();
}
int top() {
return data.top();
}
int min() {
return min_data.top();
}
};