wangxzx @ 2024-05-31 20:08:50
代码如下
#include<bits/stdc++.h>
using namespace std;
int q,n,a[100001],x;
stack<int> s;
int main()
{
cin>>q;
for(int e=1;e<=q;e++)
{
n=x;
if(e==1)
{
cin>>n;
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(i==1)
{
cin>>x;
}
s.push(a[i]);
while(!s.empty() && s.top()==x)
{
//cout<<s.top()<<endl;
s.pop();
cin>>x;
}
}
if(s.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
for(int i=1;i<=s.size();i++)
{
s.pop();
}
}
}
return 0;
}
by Tiffake @ 2024-05-31 20:47:23
@wangxzx 为什么是 n=x
by Tiffake @ 2024-05-31 20:54:38
@wangxzx 而且你这样写输入不一定输入完。
当如果栈不空,就输入不完:
if(i==1)
{
cin>>x;
}
s.push(a[i]);
while(!s.empty() && s.top()==x)
{
s.pop();
cin>>x;
}
by Tiffake @ 2024-05-31 20:57:02
@wangxzx 解决方法也很简单,先输入完再判断即可。
核心代码:
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
for(int i=1,j=1;i<=n;i++){
s.push(a[i]);
while(!s.empty() && s.top()==x[j])
{
s.pop();
j++;
}
}
by ssssbbbbbb @ 2024-05-31 21:10:08
@Tiffake 为什么删除后要j++?
by ssssbbbbbb @ 2024-05-31 21:12:56
@Tiffake 改完好像还是有问题吧?
by Tiffake @ 2024-05-31 21:14:15
@ssssbbbbbb j 是数组 x 的下标,j++ 之后就是下一个这个栈应该弹出的数,与实际的栈顶判断即可
by ssssbbbbbb @ 2024-05-31 21:18:09
@Tiffake 你给的代码第三个循环似乎手误打错了
by SX114514 @ 2024-05-31 21:18:48
#include<iostream>
#include<stack>
using namespace std;
stack<int>q;
int p,n;
int main()
{
cin>>p;
while(p--)
{
cin>>n;
int a[n+1],b[n+1],sum=1;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
{
q.push(a[i]);
while((q.top())==b[sum])
{
q.pop(),sum++;
if(q.empty())break;
}
}
if(q.empty()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
while(!q.empty())q.pop();
}
return 0;
}
by Tiffake @ 2024-05-31 21:19:02
@ssssbbbbbb 还有清空时栈不空就一直弹。
if(s.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
while(!s.empty())
{
s.pop();
}
}
}
return 0;
}
by ssssbbbbbb @ 2024-05-31 21:20:44
@Tiffake 中途不行就可以直接break了吧?