解法一:模拟

根据栈顶和下一个待出栈元素的大小关系,决定进行出栈还是入栈操作,直到满足所给出栈顺序或者中间某一步无法实现。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. ios::sync_with_stdio(false);
  5. cin.tie(0);
  6. int M, N, K;
  7. cin >> M >> N >> K;
  8. deque<int> stack;
  9. while (K-- > 0) {
  10. stack.clear();
  11. int index = 1;
  12. int num;
  13. string flag = "YES\n";
  14. for (int i = 0; i < N; ++i) {
  15. cin >> num;
  16. // 保证非空
  17. if (stack.size() < M && stack.empty()) {
  18. stack.emplace_back(index++);
  19. }
  20. if (stack.back() == num) {
  21. stack.pop_back();
  22. } else if (stack.back() > num) {
  23. flag = "NO\n";
  24. } else {
  25. while (stack.size() < M && stack.back() < num) {
  26. stack.emplace_back(index++);
  27. }
  28. if (stack.back() == num) {
  29. stack.pop_back();
  30. } else {
  31. flag = "NO\n";
  32. }
  33. }
  34. }
  35. cout << flag;
  36. }
  37. }