这是道出栈序列问题,解法是模拟,按照入栈顺序,将元素push到栈顶,每次push都访问栈顶,判断与出栈序列中当前元素是否相同,如果相同则出栈,否则push下一个元素。最后判断栈是否为空,空则“Yes”,不空则“No”。
完整AC代码如下(此代码实现使用STL栈)。
#include<bits/stdc++.h>
#include<stack>//加上了一个STL栈的头文件,如果有万能头,可以不加
using namespace std;
stack<int> s;
const int N=1e5+10;
int a[N],b[N];
int main()
{
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int n;
int k=1;//记录栈序列位置
scanf("\n%d",&n);
for(int j=1;j<=n;j++)
{
scanf(" %d",&a[j]);
}
scanf("\n");
for(int j=1;j<=n;j++)
{
scanf(" %d",&b[j]);
}
for(int j=1;j<=n;j++)
{
s.push(a[j]);
while(!s.empty()&&(s.top())==b[k])
{
//判断栈空
//当栈顶与当前元素相同时出栈
s.pop();
k++;
}
}
if(s.empty()) printf("Yes\n");
else printf("No\n");
while(!s.empty()) s.pop();//!!!多组数据注意清空!!!
}
return 0;
}
683



被折叠的 条评论
为什么被折叠?



