实现一个最小栈,有三种操作,min:得到栈中的最小值,push:在栈顶插入一个元素,pop:弹出栈顶元素,使这三种操作的时间复杂度都是O(1)
输入描述:
第一行是一个数Q,接下来Q行每行表示一个操作,每行首先是操作op 若op==0,则输出当前栈中的最小值; 若op==1,表示push,接着正整数x,把在x放进栈顶; 若op==2,表示pop,弹出栈顶元素 保证Q<=500000,保证op==0或2时(即min操作和pop操作时)栈不为空。 你可以假设一开始栈的空的。
输出描述:
对应每个op==0或2,如果是op==0输出当前栈中的最小值,如果是op==2输出弹出的元素。
示例1
输入
7 1 3 1 4 0 1 2 0 2 0
输出
3 2 2 3
不用保存所有组的输入,读一组处理一组
#include <iostream>
#include<stack>
using namespace std;
class minstack {
public:
void push(int value) {
m_data.push(value);
if(m_min.empty() || value <= m_min.top())
m_min.push(value);
}
void pop() {
if(!m_data.empty() && !m_min.empty())
{
if(m_data.top() == m_min.top())
m_min.pop();
m_data.pop();
}
else
return;
}
int top() {
return m_data.top();
}
int min() {
if(!m_data.empty() && !m_min.empty())
{
return m_min.top();
}
else
return 0;
}
private:
stack<int> m_data;//数据栈
stack<int> m_min;//辅助栈
};
int main()
{
minstack s;
int n,op,number;
cin >> n;
while(n--)
{
cin >> op;
if(op == 0)
cout << s.min() << endl;
else if(op == 1)
{
cin >> number;
s.push(number);
}
else if(op == 2)
{
cout << s.top() << endl;
s.pop();
}
}
return 0;
}