这道题就是一道很普通的模拟题,我们只需要模拟出栈的顺序即可
对于每一个给定的入栈顺序,我们模拟出栈顺序,如果模拟不下去了,我们就输出No,如果最后栈空了,就输出Yes
问题来了,我们如何取模拟出栈顺序呢。我们将出栈的指针指向出栈的第一个元素,我们先将第一个元素入栈,然后检查一下当前栈顶的元素是否等于出栈指针所指向的第一个元素,如果不等于,继续入栈,如果等于,就将栈顶元素弹出,出栈的指针后移一位,循环判断当栈不为空时,当前的栈顶元素是否等于出栈指针所指向的元素
最后,如果栈为空了,证明,入栈和出栈的顺序可行,如果栈不为空,说明不行~~~
下面是AC代码~~
#include <iostream>
#include <stack>
#define Max 100001
using namespace std;
int a[Max],b[Max];
int main()
{
stack<int> s;
int q,n;
int pos=1;
cin>>q;//q组数据
while(q--)
{
cin>>n;
pos=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++)
{
s.push(a[i]);
while(!s.empty()&&s.top()==b[pos])
{
s.pop();
pos++;
}
}
if(s.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
while(!s.empty()) //清空栈
{
s.pop();
}
}
}