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

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 q,询问次数。

接下来 q 个询问,对于每个询问:

第一行一个整数 n 表示序列长度;

第二行 n 个整数表示入栈序列;

第三行 n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

输入输出样例

输入 #1
2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3
输出 #1
Yes
No
题解
首先按要求输入询问次数q。然后在q次循环(用while循环)中每次询问的序列长度、入栈序列a和出闸序列b。再在while中用一次for循环,将a[i]入栈,当栈顶元素等于b[0]时,出栈,将x加一,
如果栈为空,则跳出这次for循环。当一遍for循环结束后,如果栈为空,则输出YES,否则输出NO。当栈非空,则出栈。
代码
#include <iostream>
#include <stack>
using namespace std;
stack<int> p;
int main()
{
    int q,n,i;
    cin>>q;
    while(q--)
    {
        cin>>n;
        int a[n],b[n],x=0;
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        for(i=0;i<n;i++)
        {
            cin>>b[i];,
        }
        for(i=0;i<n;i++)
        {
            p.push(a[i]);
            while(p.top()==b[x])
            {
                p.pop();
                x++;
                if(p.empty()) break;
            }
        }
        if(p.empty()) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        while(!p.empty()) p.pop();
    }
    return 0;
}

 


posted @ 2023-04-20 22:16  Dachi7  阅读(191)  评论(0)    收藏  举报