PAT甲级1051Pop Sequence

题目链接

https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944

题解

题目要求

  • 背景

    给定一个最大容量为M的栈,随机压入和弹出N个数(从1到N)。请判断一个序列是否有可能是该栈弹出的序列

  • 输入

    • M:不超过1000,栈的最大容量
    • N:不超过1000,输入序列的长度
    • K:不超过1000,待检查的序列的数量
    • K个序列

解题思路

模拟入栈和出栈的过程,参考了柳婼的题解。

从1到N入栈:每入栈一个数字,便判断是否出栈,如果可以出栈则出栈(重复此步骤)。如果入栈后,栈大小超过M,则跳出循环停止入栈,结果为NO;如果正确模拟了入栈和出栈,则结果为YES。

代码

// Problem: PAT Advanced 1051
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944
// Tags: 栈

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

int main()
{
    int m, n, k;
    scanf("%d%d%d", &m, &n, &k);
    vector<int> v(n + 1);
    
    while (k--){
        for (int i = 1; i <= n; i++)
            scanf("%d", &v[i]);

        stack<int> s;
        int current = 1;
        for (int i = 1; i <= n; i++){
            s.push(i);
            if (s.size() > m)
                break;
            while (!s.empty() && s.top() == v[current]){
                s.pop();
                current++;
            }
        }

        if (current == n + 1)
            printf("YES
");
        else
            printf("NO
");        
    }
    return 0;
}

参考链接

https://blog.csdn.net/liuchuo/article/details/52215337


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


原文地址:https://www.cnblogs.com/chouxianyu/p/13830894.html