1. 程式人生 > 實用技巧 >PAT(Advanced Level)A1051. Pop Sequence

PAT(Advanced Level)A1051. Pop Sequence

題意

按照1..N的順序入棧,問題目要問的序列是否可以通過入棧出棧(棧的長度是有限的)的操作來獲得

思路

  • 手動模擬1..N進棧的過程,同時進行判斷,向要求檢查的序列靠攏,在想要檢查的序列中設定游標cur = 0,比如想要檢查的是1 2 3 4 5,那麼第一次入棧的時候我們入棧1,檢查棧頂元素是否等於cur指向的元素1,如此反覆。
  • ⚠️
    • 注意棧的容量大小是有限制的,在模擬的時候要注意檢查
    • 模擬結束之後棧中可能還有元素,需要再次依次出棧檢檢視是否符合。
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 1010;
int a[1010];
int stack[1010], top = -1;
int main()
{
    int capacity, seq_len, queries;
    cin >> capacity >> seq_len >> queries;
    for(int i=0;i<queries;i++)
    {
        for(int j=0;j<seq_len;j++)      cin >> a[j];
        int cur = 0;
        bool legal = true;      //合法與否的判斷標誌
        top = -1;
        for(int j=1;j<=seq_len;j++)     //模擬1..N的入棧過程
        {
            stack[++top] = j;
            if(top >= capacity)     //檢查棧裡的元素個數是否超過容量
            {
                legal = false;
                break;
            }
            while(top >= 0 && stack[top] == a[cur])
            {
                top--;
                cur++;
            }
        }
        while(cur <= seq_len)
        {
            if(stack[top] != a[cur])
            {
                legal = false;
                break;
            }else{
                top--;
                cur++;
            }
        }
        if(!legal)
            cout << "NO\n";
        else    cout << "YES\n";
    }
    return 0;
}