思路
用两个栈来实现,其中一个作为最小栈,操作思路:
- push时,只有最小栈为空或者当前元素 ≤ 最小栈顶元素时,才push到最小栈中;
- pop时,只有栈顶元素等于最小栈顶元素时,才将最小栈顶元素弹出。
由于数据保证没有不合法的操作,这里就不做判空异常了。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<int> stk, stkMin;
int getMin()
{
return stkMin.top();
}
void push(int num)
{
if (stkMin.empty()) stkMin.push(num); //最小栈为空
else if (num <= getMin()) stkMin.push(num); //当前元素 ≤ 最小栈顶元素
stk.push(num);
}
void pop()
{
int num = stk.top();
stk.pop();
if (num == getMin()) //栈顶元素等于最小栈顶元素
{
stkMin.pop();
}
}
int main()
{
int n;
cin >> n;
while (n -- )
{
string s;
cin >> s;
if (s == "push") //push操作还需要额外读入一个数字
{
int num;
cin >> num;
push(num);
}
else if (s == "pop")
{
pop();
}
else //只有getMin操作需要输出
{
cout << getMin() << endl;
}
}
return 0;
}