1. 程式人生 > 實用技巧 >css變化以及動畫播放

css變化以及動畫播放

題目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;
}