zoukankan      html  css  js  c++  java
  • PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)

    1051 Pop Sequence (25 分)
     

    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,...,n是入栈序列,元素出栈顺序随意,现给定出栈顺序(e.g.1~n的一个排列),问这个出栈顺序是否合理,合理输出"YES",否则输出"NO"。

    题解:

    开一个队列,开一个栈,输入一个数,就队列中这个数及之前的数放入栈中,放入不能超过容量。然后看栈顶元素是不是这个数,是就下一个,不是就标记NO。

    AC代码:

    #include<iostream>
    #include<stack>
    #include<queue>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<cstring>
    using namespace std;
    int n,m,k;
    stack<int>s;
    queue<int>q;
    int main(){
        cin>>n>>m>>k;
        while(k--){
            while(!s.empty()) s.pop();
            while(!q.empty()) q.pop();
            int f=1;
            for(int i=1;i<=m;i++) q.push(i);
            for(int i=1;i<=m;i++){
                int x;
                cin>>x;
                if(s.empty()||s.top()!=x){
                    while(!q.empty()){
                        if(s.size()<n) {
                            //cout<<"把"<<q.front()<<"放栈"<<endl;
                            s.push(q.front());
                            q.pop();
                        }
                        else break;    
                        if(s.top()==x) break;
                    }
                }
                if(s.top()==x){
                    s.pop();
                    //cout<<x<<"踢出栈"<<endl;
                    continue;
                }
                f=0;
            }
            if(f) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    常用的长度单位
    HTML常用的列表标签
    html常用文本标签
    CSS选择器及优先级
    块级元素与内联元素
    移动端app打包
    内联框架
    Leetcode303.区域和检索-数组不可变
    Leetcode107.二叉树的层次遍历||
    Leetcode784.字母大小写全排列
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/11483896.html
Copyright © 2011-2022 走看看