• XDOJ-267 判断栈输出顺序正确与否


    本题算是比较难的,如果要遍历每一个输出进行比较的话将会十分困难,但是通过逆向,我们将可以化难为易。基本思路是:将输入的出栈序列按照顺序进行弹出,如果能够弹出就证明输出正确,否则就输出错误。如按照此顺序弹出:3 2 1 7 5 6 4,那么就是先入栈123,之后进行比较将3出栈,再比较,将2、1分别出栈,再入栈4 5 6 7,再进行比较,出栈7,最后发现无法在不出栈6的情况下出栈5,则证明此顺序错误。但是,在这之中亦需要考虑栈是否已满,能否入栈等问题,因为此问题中栈的容量也是不确定的因素。

    问题描述

    给定一个栈,其中最多存储M个数据。将N个数据以1,2,3,...,N的顺序压栈,然后再随机弹栈。判断一下哪些是有可能的弹栈顺序,而哪些不是。例如M是5,N是7,我们可以得到1, 2, 3, 4, 5, 6, 7的弹栈顺序,而不能得到3, 2, 1, 7, 5, 6, 4这样的弹栈顺序。(M,N<=1000)

    输入说明

    输入包含了一种情况下的测试数据。在每种情况下,有三组输入数据:

    第一组列在首行,包含了三个数据:栈的最大容量M,压栈数据长度N,要验证的弹栈序列个数K。

    第二组为压栈数据:N个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。

    第三组为K行数据,每行包括了一个需要验证的弹栈序列(含N个数据)。

    同行数据间以空格隔开。

    输出说明

    输出应该包括K行,包行了对每个输入的验证序列,输出的一个判断结果。如果这个弹出序列可能发生,就输出“YES”,否则就输出“NO”。

    输入样例

    5 7 5

    1 2 3 4 5 6 7

    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

    输出样例

    YES

    NO

    NO

    YES

    NO

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main()
    7. {
    8. int m,n,times, tempKey,keyi,tempNum;
    9. keyi = 0;
    10. int key[1005] = {};
    11. cin >>m>> n>>times;
    12. stack<int> s;
    13. queue<int> q;
    14. for (int i = 0; i < n; i++)
    15. {
    16. cin >> key[i];
    17. }
    18. for (int ii = 0; ii < times; ii++)
    19. {
    20. int Numi = 0;
    21. int Num[1005] = {};
    22. for (int i = 0; i < n; i++) //Num[]为待测试的数组
    23. cin >> Num[i];
    24. tempKey = key[keyi];
    25. s.push(tempKey);
    26. keyi++;
    27. for (;keyi < n; )
    28. {
    29. while (s.empty() || s.top() != Num[Numi])
    30. {
    31. s.push(key[keyi]);
    32. keyi++;
    33. }
    34. if (s.size() > m)
    35. break;
    36. while (!s.empty() && s.top() == Num[Numi])
    37. {
    38. s.pop();
    39. Numi++;
    40. }
    41. }
    42. if (s.empty())
    43. cout << "YES" << endl;
    44. else
    45. cout << "NO" << endl;
    46. while (!s.empty())
    47. {
    48. s.pop();
    49. }
    50. keyi = 0;
    51. }
    52. return 0;
    53. }

    欢迎大家关注:https://github.com/XDUgaile

    写完的一些东西会不定时丢上去。

  • 相关阅读:
    Springboot+高校考勤小程序 毕业设计-附源码131039
    HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
    【Java小白福利】Java面试、学习教程合集!
    Python实战:读取MATLAB文件数据(.mat文件)
    Sora 的工作原理(及其意义) [译]
    计算机视觉之三维重建——第八章:SLAM系统设计《深入浅出sfm和SLAM核心算法 (鲁鹏)》
    Android组件通信——ActivityGroup(二十五)
    统计一个十进制数 的二进制中有多少个1
    国家矿山安全监察局关于露天矿山边坡监测系统建设及预警响应要求
    python 数的计算
  • 原文地址:https://blog.csdn.net/m0_63355790/article/details/127657479