zoukankan      html  css  js  c++  java
  • Pop Sequence

      题目来源PTA02-线性结构3 Pop Sequence   (25分)

      Question:Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

      Input Specification:

      Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

      Output Specification:

      For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

      Sample Input:

    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

      Sample Output:

    YES
    NO
    NO
    YES
    NO

      分析:此题考察栈的操作,入栈的顺序是1,2,3......,N。出栈序列以5 6 4 3 7 2 1为例,要pop 5,就必须先push 1, push 2, push 3, push 4, push5, 此时栈顶元素为5,刚好匹配,才能进行pop操作。这里首先清空栈,设置一个将要入栈的顺序值temp,由1开始自增。当栈顶元素与读取的出栈序列值不匹配(还要考虑栈空的情况)时就进行入栈操作: Sta.push(temp++); ;当栈顶元素与读取的出栈序列值匹配,要进行出栈操作 Sta.pop(); 弹出栈顶元素,再读取下一个出栈序列值。如果栈中的元素个数超过了M,则说明出现了错误,这种出栈序列是不成立的。

      源码

    #include<iostream>
    #include<stack>        //调用C++ STL中的堆栈容器
    using namespace std;
    
    int main()
    {
        int M, N, K;
        int obtain, pop;   // obtain为将要入栈的顺序值(1,2,..,N),pop为当前读取的出栈序列值
        bool is_failed;    // 出栈序列成立与否的标志
        stack<int> sta;
        cin >> M >> N >> K;
        for (int i = 0; i < K; i++)     // 循环输入K组待判定的出栈序列
        {
            is_failed = false;
            obtain = 1;
            for (int j = 0; j < N; j++)  // 循环读取每个出栈序列值
            {
                cin >> pop;
                while (sta.size() <= M && !is_failed)    // 栈未满且未确认出栈序列不成立
                {
                    if (sta.empty() || pop != sta.top()) // 栈为空或当读取的出栈序列值与栈顶元素不相等时,把顺序值temp压栈并递增
                    {
                        sta.push(obtain++);
                    }
                    else      // 当前读取的出栈序列值与栈顶元素相等时出栈,跳出循环继续读取下一个出栈序列值
                    {
                        sta.pop();
                        break;
                    }
                }
                if (sta.size() > M)
                {
                    is_failed = true;  // 确认出栈序列不成立
                }
            }
            if (is_failed)    cout << "NO" << endl;
            else    cout << "YES" << endl;
            while (!sta.empty())    sta.pop();  // 清空栈,因为下一次匹配还要用
        }
        return 0;
    }
  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/eniac12/p/4871772.html
Copyright © 2011-2022 走看看