PAT (Advanced Level) Practice 1051 Pop Sequence(25分)【栈、模拟】

Given a stack which can keep M M numbers at most. Push N N numbers in the order of 1, 2, 3, …, N N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M M is 5 and N N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M M (the maximum capacity of the stack), N N (the length of push sequence), and K K (the number of pop sequences to be checked). Then K K lines follow, each contains a pop sequence of N N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line “YES” if it is indeed a possible pop sequence of the stack, or “NO” if not.

Sample Input:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

Sample Output:

YES
NO
NO
YES
NO

题意

有一个容量限制为M的栈,先分别把1,2,3,…,n依次入栈,在入栈的过程中可以随机出栈。给出一系列出栈顺序,问这些出栈顺序是否可能。

思路

模拟。

代码

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    int m, n, k;
    cin >> m >> n >> k;

    for (int i = 0; i < k; ++i) {
        stack<int> stk;
        vector<int> target(n);

        for (int j = 0; j < n; ++j)
            cin >> target[j];

        for (int j = 1, pos = 0; j <= n; ++j) {
            if (stk.size() == m)
                break;

            stk.push(j);

            while (not stk.empty() && stk.top() == target[pos]) {
                stk.pop();
                ++pos;
            }
        }

        if (stk.empty())
            cout << "YES\n";
        else
            cout << "NO\n";
    }
}
发布了184 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Exupery_/article/details/104095329