【深基15.習9】驗證棧序列 洛谷P4387

題目描述

給出兩個序列 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; 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章