题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
可能很多人一开始只想到用一个变量来记录最小值,每次更新最小值,但其实是不对的,因为考虑到有元素弹出的情况,当最小值弹出后,如何保持O(1)时间找到下一个最小值呢?
正确的解法:用一个辅助栈来存最小值和一系列次小值,栈顶存着最小值,当最小值弹出后,还会有次小值浮到栈顶。当弹出和删除时,对应地更新这个辅助栈。
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
class Solution {
private:
stack<int> st_x;
stack<int> st_min;
public:
void push(int value) {
st_x.push(value);
if(st_min.size()==0||value<st_min.top()) {
st_min.push(value);
}
}
void pop() {
int pop_num=st_x.top();
if(pop_num==st_min.top()) {
st_min.pop();
}
st_x.pop();
}
int top() {
return st_x.top();
}
int min() {
return st_min.top();
}
};
int main()
{
Solution sol;
sol.push(1);
sol.push(2);
cout<<sol.min()<<endl;
system("pause");
return 0;
}