洛谷第一題
阿新 • • 發佈:2022-04-03
給出兩個序列 pushed 和 poped 兩個序列,其取值從 1 到 n(n\le100000)n(n≤100000)。已知入棧序列是 pushed,如果出棧序列有可能是 poped,則輸出 Yes
,否則輸出 No
。為了防止騙分,每個測試點有多組資料。
輸入格式
第一行一個整數 qq,詢問次數。
接下來 qq 個詢問,對於每個詢問:
第一行一個整數 nn 表示序列長度;
第二行 nn 個整數表示入棧序列;
第二行 nn 個整數表示出棧序列;
輸出格式
對於每個詢問輸出答案。
輸入輸出樣例
輸入 #12 5 1 2 3 4 5 5 4 3 2 1 4 1 2 3 4 2 4 1 3輸出 #1
Yes No
解題思路
我們輸入兩個陣列,這兩個陣列元素相同,順序相反。
將一個數組進棧,如果棧頂元素和b陣列第一個元素相等則將該元素出棧。
最後判斷棧是否為空,若為空則輸出YES,若不為空則輸出NO.
下面是程式碼
#include<iostream>
#include<stack>
using namespace std;
stack<int>q;//棧q
int p,n;//p組資料,n為序列長度
int main()
{
cin>>p;
while(p--)
{
cin>>n;
int a[n+1],b[n+1],sum=1;//入棧佇列a,待檢驗佇列b,計數器sum
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])//當棧頂元素與b中當前元素相同時出棧
{
q.pop(),sum++;//sum++到b下一個元素
if(q.empty())break;//注意這裡,第一次RE就因為當棧空時還用了出棧操作,所以要手動結束迴圈
}
}
if(q.empty()) cout<<"Yes"<<endl;//如果棧為空說明出棧序列b正確
else cout<<"No"<<endl;
while(!q.empty())q.pop();//清空棧
}
return 0;//謝幕
}