题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 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
不知道有没有朋友和我一样下意识以为就是两个数组倒过来比了,乐死
这题考虑的其实是出栈入栈,打个比方
pushed- 1,2,4,3,5
poped-4,2,1,5,3
这样也是正确的哈哈
poped-4,2,1,3,5
poped-1 ,2,3,4,5
..........
这些都是正确的,对于情况一,当4入栈时,栈内有1,2,4,我们第一个出栈为4,然后2,1,此时栈内为空,接着3入栈5入栈,第四个出栈的就是5,然后时3
对于情况三,1入栈,1出栈,2入栈,2出栈,4入栈,先不出,3入栈,3出栈,4出栈,5入栈,5出栈
#include<stdio.h>
int main()
{
int n,m,l=0;
int x=0,y=0,z=0;
int a[100010]={0},b[100010]={0},c[100010]={0};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d",&a[j]);
}
for(int j=0;j<m;j++)
{
scanf("%d",&b[j]);
}
while(y!=m)
{
c[z]=a[x];
while(c[z]==b[y]&&y!=m&&z>=0)
{
y++;
z--;
}
z++;
x++;
if(x==m&&y!=m)
{
l=1;
}
}
if(l==0)
printf("Yes\n");
else
printf("No\n");
x=0,l=0,y=0,z=0;
}
}