这道题有三种模式,0,1,2,分别是入库,出库,查询,题目中说入库和出库都是按照时间顺序,也就是说是按照栈的先进后出的特点进行的,很明显我们需要使用栈来解决问题,而查询则是每次将库中最重的集装箱输出。所以我们需要在进行查询操作的时候,计算出栈内最大值。对于栈而言,不向其他数据结构一样,没有很好的遍历方法来进行求最大值,这时候我们就可以借助一个辅助栈来记录栈内元素的最大值,每一次进行入库操作的时候,与栈顶元素进行比较,如果大于栈顶元素,就压栈,否则还是压入栈顶元素,此时有一个疑问,万一我压入的是把栈顶元素算在内的第二大的元素呢,因为栈是后进先出,所以最大值是不会比后压入的元素先出的,我们如此操作一定是能保证辅助栈的栈顶元素是当前栈内最大的,对于出库和查询正常操作即可。
#include <iostream>
#include <stack>
#define int long long
using namespace std;
signed main() {int n; cin >> n;stack<int> s1, s2;for (int i = 1; i <= n;i++) {int m; cin >> m; if (m==0) {int x; cin >> x;s1.push(x);//只有当输入值大于上一个最大值,才压入//否则还压入上一个最大值(栈顶元素),因为出栈的时候是后进先出,上一个最大值不会被弹出if (s2.empty()||x>s2.top()) {s2.push(x);}else {s2.push(s2.top());}}else if (m == 1) {s1.pop();s2.pop();}else {if (!s2.empty()) cout << s2.top()<<endl;else cout << 0 << endl;}}return 0;
}