zoukankan      html  css  js  c++  java
  • PAT Advanced 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

    题目分析

    已知一个栈限制容量最大为M,push操作压入1,2,3...N,已知K个序列,判断序列是否可能是出栈顺序

    解题思路

    1. 1~N依次入栈,在入栈过程中,由p指针指向序列中当前等待出栈的元素
    2. 如果栈顶元素恰好等于序列当前等待出栈的元素,让栈顶元素出栈,p指针后移
    3. 继续循环2的操作,知道栈顶元素不等于序列中当前等待出栈的元素
    4. 继续1~N的压入
    5. 判断是否为出栈顺序
      • 如果压栈过程中栈大小>=M,说明栈满,该序列不是出栈顺序,退出;
      • 如果压栈执行结束后,栈中有剩余元素或者p指针未指向序列末尾,证明该序列不是出栈顺序

    Code

    Code 01

    #include <iostream>
    #include <stack>
    using namespace std;
    int main(int argc,char * argv[]) {
    	int n,m,k;
    	scanf("%d%d%d",&n,&m,&k);
    	int seq[m]= {0};
    	for(int i=0; i<k; i++) {
    		for(int j=0; j<m; j++) {
    			scanf("%d",&seq[j]);
    		}
    		stack<int> sk;
    		int j,p = 0;
    		for(j=1; j<=m; j++) {
    			if(sk.size()>=n)break;
    			sk.push(j);
    			while(!sk.empty()&&sk.top()==seq[p]) {
    				sk.pop();
    				p++;
    			}
    
    		}
    		if(j<=n||!sk.empty())printf("NO
    ");
    		else printf("YES
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/houzm/p/12257954.html
Copyright © 2011-2022 走看看