第五周--验证栈序列

题目描述

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

输入格式

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

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

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

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

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

输出格式

对于每个询问输出答案。

输入输出样例

输入 
2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3
输出 
Yes
No

通过简单地阅读题目可知,对于给定的入栈序列,验证序列poped是否为入栈序列可能的一个出栈序列
  1. 入栈(push())
  2. 是否栈空(empty())
  3. 访问栈顶(top())
  4. 出栈(pop())

#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<int>q;
int n,p,tmp=0;
cin>>p;//输入询问的次数
for(int t=p;t>0;t--)
{
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++)
cin>>a[i];//输入push的数组
for(int j=0;j<n;j++)
cin>>b[j];//输入pop的数组
for(int i=0;i<n;i++)
{
q.push(a[i]);//将push数组存入栈中
while(q.top()==b[tmp])//栈是先进后出,如果相等就删除,不相等就相当于已经不是了
{
q.pop();//相等就删除
tmp++;//一个个相比较
if(q.empty())
break;
}
}
if(q.empty())//如果栈为空就验证成功
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
while(!q.empty())
q.pop();
tmp=0;//清空栈
}
return 0;
}




posted @ 2023-04-19 11:48  小白船、  阅读(45)  评论(0)    收藏  举报