題目描述
給出兩個序列 pushed 和 poped 兩個序列,其取值從 1 到 n(n≤100000)。已知入棧序列是 pushed,如果出棧序列有可能是 poped,則輸出 Yes
,否則輸出 No
。爲了防止騙分,每個測試點有多組數據。
輸入格式
第一行一個整數 q,詢問次數。
接下來 q 個詢問,對於每個詢問:
第一行一個整數 n 表示序列長度;
第二行 n個整數表示入棧序列;
第二行 n個整數表示出棧序列;
輸出格式
對於每個詢問輸出答案。
題解:
通過簡單地閱讀題目可知,題意爲對於給定的入棧序列 pushed驗證序列poped是否爲入棧序列可能的一個出棧序列。
由於數據範圍比較小(n≤100000)不會爆棧,可以用STL!
代碼:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
stack<int>q;
int p,n;
int a[N],b[N];//a爲入棧序列,b爲出棧序列
int main()
{
scanf("%d",&p);
while(p--)
{
scanf("%d",&n);
int cnt=1;//計數器
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
q.push(a[i]);
while((q.top())==b[cnt]) //當棧頂元素與b中當前元素相同時出棧
{
q.pop();//出棧
cnt++;//cnt++到b下一個元素
if(q.empty())break;//結束循環(不然會RE)
}
}
if(q.empty()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
while(!q.empty())q.pop();
}
return 0;
}