• 6--Pop Sequence


     题目大意:

            第一行输入M(栈的最大容量)\N(数字序列的最大数)\K(列出下面K行需要判断的情况)

            剩下K行输入1-7的排列组合(每个数字进一次),判断每行对于这个栈push和pop随机组合,能否出现本次的排列组合。能->YES  ,否->NO 

    样例输入:

    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

    输出:

    YES
    NO
    NO
    YES
    NO

     思路分析:

            看能否出现此组合,暴力列出所有情况实属下策。正解--->模拟栈可能的操作.

           

            对于第一个数字(待测的序列p,以5 6 4 3 7 2 1为例)即5,那么栈肯定是依次压入了1、2、3、4、5然后pop出5。

            此后依次判断p[i-1]和p[i-1]的大小

            ①若前者小,说明肯定进行了相应的压入,比如对于6,5<6,那么栈的操作就是压入6(前面1-5已经使用过了,这里使用point依次++定位),然后pop 6即可。

            ②若前者大,比如对于4,此时的栈中5和6已经pop了,那直接pop出一个num,看num是否等于p[i]即可。

    注意:

            边界条件:栈不能超过M!!!,注意push之后判断一下是否越界

    AC代码:

    1. #include
    2. #define ERROR -1
    3. using namespace std;
    4. class Stack
    5. {
    6. public:
    7. Stack(int c) :Capcity(c)
    8. {
    9. top = -1;
    10. Arr = new int[c];
    11. }
    12. int pop()
    13. {
    14. if (top == -1)return ERROR;
    15. return Arr[top--];
    16. }
    17. int GetTop()
    18. {
    19. return Arr[top];
    20. }
    21. void push(int data)
    22. {
    23. if (top == Capcity - 1)return;
    24. Arr[++top] = data;
    25. }
    26. bool isEmpty() { return top == -1; }
    27. int GetCapcity() { return Capcity; }
    28. private:
    29. int* Arr;
    30. int Capcity;
    31. int top;
    32. };
    33. bool Judge(Stack stack, int* p, int len)
    34. {
    35. int MaxLen = stack.GetCapcity();
    36. int count = 0;//看是否越
    37. int point = 1;//指针d,0-9从0-9按顺序push
    38. for (int i = 0; i < len; i++)
    39. {
    40. if (i != 0 && p[i] < p[i - 1])
    41. {
    42. int c = stack.pop();
    43. count--;
    44. if (c != p[i])return 0;
    45. }
    46. else
    47. {
    48. for (; point <= p[i]; point++)
    49. {
    50. stack.push(point);
    51. count++;
    52. if (count == MaxLen + 1)return 0;
    53. }
    54. stack.pop(); count--;
    55. }
    56. }
    57. return 1;
    58. }
    59. int main()
    60. {
    61. int M, N, K;
    62. cin >> M >> N >> K;
    63. Stack stack(M);
    64. int* pArr = new int[N];
    65. for (int i = 0; i < K; i++)
    66. {
    67. for (int j = 0; j < N; j++)
    68. {
    69. cin >> pArr[j];
    70. }
    71. if (Judge(stack, pArr, N))
    72. cout << "YES" << endl;
    73. else
    74. cout << "NO" << endl;
    75. }
    76. return 0;
    77. }

  • 相关阅读:
    第五届传智杯【初赛】- F-二人的大富翁游戏
    SQL39道代码练习题
    【Linux安装jmeter性能测试】
    面试:插件化相关---so
    开放式运动耳机哪款好,盘点几款目前最好的开放式耳机分享
    rabbitmq队列卡住的一种情况(webservice接口超时)
    Java并发之volatile关键字内存可见性问题
    在湖北考一个安全员c3住建厅安全员c证持证上岗
    element表格实现单选框
    PyQt5基础练习2
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126375418