zoukankan      html  css  js  c++  java
  • 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/

    欢迎讨论和交流!


  • 相关阅读:
    最长上升子序列问题总结
    Problem C
    Problem C
    Problem P
    Problem P
    Problem H
    Problem H
    Problem D
    Problem D
    Linux系统调用--getrlimit()与setrlimit()函数详解
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/13830894.html
Copyright © 2011-2022 走看看