1. 程式人生 > >資料結構實驗之棧與佇列七:出棧序列判定

資料結構實驗之棧與佇列七:出棧序列判定

Problem Description

給一個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入一個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。

例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個出棧序列,但4,3,5,1,2就不可能是該序列的出棧序列。假設壓入棧的所有數字均不相等。

Input

 第一行輸入整數n(1<=n<=10000),表示序列的長度。

第二行輸入n個整數,表示棧的壓入順序。

第三行輸入整數t(1<=t<=10)。

後面依次輸入t行,每行n個整數,表示要判斷的每一個出棧序列。

Output

 對應每個測試案例輸出一行,如果由初始入棧序列可以得到該出棧序列,則輸出yes,否則輸出no。

Sample Input

5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2

Sample Output

yes
no
#include<stdio.h>
#include<stdlib.h>
int a[10001],stacks[10001];
int main()
{
    int t,n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&t);
    while(t--)
    {
        int temp,p=0,q=-1;
        for(i=0;i<n;i++)
        {
            scanf("%d",&temp);
            while(q==-1||stacks[q]!=temp)
            {
                if(p>=n)break;
                stacks[++q]=a[p++];
            }
            if(stacks[q]==temp)
                q--;
        }
        if(q==-1)
        {
            printf("yes\n");
        }
        else printf("no\n");
    }
    return 0;
}