题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944

这题思路参考了一下算法笔记,其他都自己写的,居然和算法笔记上的代码差不多
唯一一个坑点是26行注释的代码会报错,我也是醉了,一定要判空条件在前才可以正确通过(否则有可能为空,top()就为无效迭代器了),以后尽量都先这样写吧

代码

  1. #include<stack>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<iostream>
  5. using namespace std;
  6. stack<int> s;
  7. vector<int> input;
  8. int main(){
  9. int m, n, k;
  10. scanf("%d%d%d", &m, &n, &k);//m是栈的容量,n是序列的长度,k是有多少序列要检查
  11. input.resize(n + 1);
  12. for(int i = 0; i < k; i++){
  13. while(!s.empty()) s.pop();
  14. bool flag = true;
  15. int now = 1;
  16. for(int j = 1; j <= n; j++) cin>>input[j];//初始化判断序列
  17. for(int j = 1; j <= n; j++){//开始入栈
  18. s.push(j);
  19. if(s.size() > m){
  20. flag = false;
  21. break;
  22. }
  23. while(!s.empty() && s.top() == input[now]){
  24. //while(s.top() == input[now] && !s.empty()){
  25. s.pop();
  26. now++;
  27. }
  28. }
  29. if(s.empty() && flag){
  30. printf("YES\n");
  31. } else {
  32. printf("NO\n");
  33. }
  34. }
  35. return 0;
  36. }