1. 程式人生 > 其它 >洛谷第一題

洛谷第一題

給出兩個序列 pushed 和 poped 兩個序列,其取值從 1 到 n(n\le100000)n(n100000)。已知入棧序列是 pushed,如果出棧序列有可能是 poped,則輸出 Yes,否則輸出 No。為了防止騙分,每個測試點有多組資料。

輸入格式

第一行一個整數 qq,詢問次數。

接下來 qq 個詢問,對於每個詢問:

第一行一個整數 nn 表示序列長度;

第二行 nn 個整數表示入棧序列;

第二行 nn 個整數表示出棧序列;

輸出格式

對於每個詢問輸出答案。

輸入輸出樣例

輸入 #1
2
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;//謝幕 
}