题目


解法1

点击查看代码
#include <iostream>
#include <stack>
using namespace std;

int main() {
    int M, N, K;
    cin >> M >> N >> K;  // 读取栈的最大容量、入栈序列长度、查询序列数量

    while (K--) {  // 遍历 K 组出栈序列
        stack<int> s;
        int index = 1;  // 模拟入栈的顺序,从 1 开始
        bool valid = true;  // 标记当前序列是否合法
        
        for (int i = 0; i < N; i++) {
            int x;
            cin >> x;
            
            // 先将数据按顺序压栈,直到栈顶是当前要出栈的元素
            while (index <= N && (s.empty() || s.top() != x)) {
                s.push(index++);
                if (s.size() > M) {  // 超出栈容量,非法
                    valid = false;
                    break;
                }
            }
            
            // 检查栈顶是否匹配出栈元素
            if (!s.empty() && s.top() == x) {
                s.pop();  // 符合出栈顺序,出栈
            } else {
                valid = false;  // 出现不匹配情况,非法
            }
        }

        cout << (valid ? "YES" : "NO") << endl;
    }

    return 0;
}