出栈序列(栈和队列)

已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。
  例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input 输入数据包含若干组测试样例。

  每组测试样例的第一行为整数N(1≤N≤10000);
  第二行为N个正整数,以空格隔开,为出栈序列;
  输入数据的末尾以一个0表示输入的结束。

Output

对于每组测试样例,输出结果为一行字符串。

  如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。
  注意:区分大小写,引号本身不输出。

Sample Input

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

Sample Output

Yes
No
思路:例如第一组样例 先放1 2 3 让3出栈 放4 让4出 现在栈里有1 2 再让2出 让1出 在放5 让5出 满足    第二组样例  让1 2 3 进栈 3出 让4 5进栈 5出 可不能让1出  所以NO

#include <iostream>

#include<cstdio>
#include<stack>
using namespace std;
#include <stdio.h>
stack<int> str;
int main()
{
    int a[100000]={0},i,j,n,t,p=0;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)
            break;
        p=0;
        for(i=0;i<=n-1;i++)
            scanf("%d",&a[i]);
        for(i=1;i<=a[0];i++)
            str.push(i);
        str.pop();
        for(i=1;i<=n-1;i++)
        {
            if(a[i]>a[i-1])
                for(j=a[i-1]+1;j<=a[i];j++)
               {
                str.push(i);
                str.pop();
               }
            else
            {
                t=str.top();
                if(t==a[i])
                    str.pop();
                else
                {
                    p=1;
                    break;
                }
            }
        }
        if(p==0)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zcy19990813/article/details/80328462