POJ 1363 Rails

题目POJ 1363

题意

1-n顺序入栈,判断出栈顺序是否合法

思路

用栈和队列,模拟入栈出栈操作
  1. 将元素顺序压入栈中

  2. 每压入一个数字,判断是否和队列的头元素相等,若相等,就在栈和队列中弹出这两个元素

  3. 直到两元素不相同

  4. 如果最后栈不为空,说明不是合法序列

输入

5//序列元素个数
1 2 3 4 5//出栈顺序
5 4 1 2 3//出栈顺序
0//5个数的序列判断结束
6//序列元素个数
6 5 4 3 2 1//出栈顺序
0//6个数的序列判断结束
0//输入结束

代码实现

#include <iostream>
#include<cstdio>
#include<stack>
#include<queue>
//判断出栈顺序是否正确
int check_is_valid_order(std::queue<int>&order);
int main()
{
    int n;
    int train;
    scanf("%d",&n);
    while(n)
    {
        scanf("%d",&train);
        while(train)
        {
            std::queue<int>order;
            order.push(train);
            for(int i=1;i<n;i++)
            {
                scanf("%d",&train);
                order.push(train);
            }
            if(check_is_valid_order(order))
            {
                printf("Yes\n");
            }
            else
                printf("No\n");
            scanf("%d",&train);
        }
        putchar('\n');
        scanf("%d",&n );
    }
    return 0;
}
int check_is_valid_order(std::queue<int>&order)
{
    std::stack<int>S;
    int n=order.size();//1-n顺序入栈
    for(int i=1;i<=n;i++)
    {
        S.push(i);
        while(!S.empty()&&S.top()==order.front())
        {
            S.pop();
            order.pop();
        }
    }
    if(S.empty())
        return 1;
    else
        return 0;
}
posted @ 2020-11-01 16:27  inss!w!  阅读(67)  评论(0编辑  收藏  举报