警示后人(STL做法)

P4387 【深基15.习9】验证栈序列

HenryQ2022 @ 2023-08-27 19:55:05

#include <iostream>
#include <stack>
using namespace std;

int n, m;
int a[100010], b[100010];
stack<int> st;
int main() {
    cin >> n;
    for(int aa = 1;aa <= n;aa++) {
        cin >> m;
        for(int i = 1;i <= m;i++)
            cin >> a[i];
        for(int i = 1;i <= m;i++)
            cin >> b[i];
        int cur = 1;
        for(int i = 1;i <= m;i++) {
            st.push(a[i]);
            while(st.size() != 0 && st.top() == b[cur]) {
                cur++;
                st.pop();
            }
        }
        if(st.size() != 0)
            cout << "No" << endl;
        else
            cout << "Yes" << endl;
    }
    return 0;
}

如果你把栈定义在aa循环里,那本讨论

与你无关

如果你大概是这样写的,就WA。

为什么呢?

因为我们要每次循环栈里需要非常的干净

但aa 循环到第二次的时候,栈里的值 是 上一次计算的值,所以需要在28-29之间插入清空栈的代码!

本juruo在这里被坑了

仔细想想,其实上面 栈还有值 的情况仅仅会在输出为"No"的时候

附加评测

20pts(没有清空栈)


|