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\n");
        else
            printf("NO\n");        
    }
    return 0;
}
参考链接
https://blog.csdn.net/liuchuo/article/details/52215337
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号