【PAT A1051】【棧/模擬】

lyx_2016發表於2020-12-16

題目大意:給你棧的容量M和k個長度為n的序列,問你將1,2,…,n依次入棧,這k個序列所代表的出棧順序是否可行。

我一開始覺得可行序列可能遵循某種規律,但是找了半天沒有發現。看了題解之後才驚覺模擬就可以解決。TvT

在將n個元素依次入棧的過程中,判斷當前要入棧的元素是否與需要判斷的出棧序列裡的元素相同,如果相同的話就依次出棧。
棧滿,或者最後棧中仍有元素則輸出“NO”,否則就是“YES”
【我實在是個很差的講題人TvT 這個模擬感覺挺裸的,不知道該咋個描述】

#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;

int ps[1005];
stack<int> s;

int main()
{
    int M, N, K;
    scanf("%d %d %d", &M, &N, &K);
    while (K--)
    {
        for (int i = 0; i < N; i++)
        {
            scanf("%d", &ps[i]);
        }

        int cnt = 0;
        bool flag = true;
        for (int i = 1; i <= N; i++)
        {
            if (s.size() == M)
            {
                flag = false;
                break;
            }
            s.push(i);
            while (!s.empty() && s.top() == ps[cnt])
            {
                cnt++;
                s.pop();
            }
        }
        if (flag == true && s.empty())
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
        while (!s.empty())
        {
            s.pop();
        }
    }
    return 0;
}

需要注意的是在取top和pop的時候判斷棧非空,每組測試之間將棧清空。

相關文章