PAT (Advanced Level) Practice 1051 Pop Sequence (25 分) 凌宸1642

PAT (Advanced Level) Practice 1051 Pop Sequence (25 分) 凌宸1642

题目描述:

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.

译:给定一个做多能够存储 M 个数字的栈。将 N 个数字按照 1, 2, 3, ..., N 的顺序入栈,并且出栈随机。你应该说明给定的一个数字序列是否是这个栈的一种可能的出栈的顺序 。例如,如果 M 是 5 , N 为 7 , 我们可以从这个栈获得出栈序列 1, 2, 3, 4, 5, 6, 7 但是不能获得序列 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.

译:每个输入文件包含一个测试用例。对于每个用例,第一行包含 3 个数字(都不超过 1000) :M (栈的最大容量) , N(入栈的序列长度) , 和 K(需要查验的序列总数)。接下来 N 行,每行包含一个 N 个数字的出栈的序列。所有在一行的数字用空格隔开。


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.

译:对于每个出栈序列,如果确实可能是该栈的一个出栈序列,则在一行中打印 YES,否则打印 NO


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

The Idea:

  • 模拟问题。
  • 对于每一个出栈序列,模拟其入栈过程。当一个数字入栈时,判断此时的元素与出栈序列的第一个元素是否相同,如果相同则出栈,且指向出栈数组的后一个元素。如果当前栈的容量大于 M ,则说明该序列不是合法的出栈序列。当所有的元素入栈完毕,如果此时的栈不空,则说明序列非法,否则序列合法

The Codes:

#include<bits/stdc++.h>
using namespace std ;
int num[1010] , m , n , k ;
bool isVaild(){
	stack<int> s ;
	for(int j = 1 , i = 0 ; j <= n ; j ++){
		s.push(j) ;
		if(s.size () > m) return false ;// 如果栈的大小超过固定容量,则是非法序列 
		while(!s.empty() && s.top() == num[i]){ //栈不空且栈顶和数组元素相同
			i ++ ; // 指向数组元素的指针后移
			s.pop() ; // 栈顶元素出栈
		} 
	}
	return s.empty() ; // 栈空则合法,否则不合法
}
int main(){
	scanf("%d %d %d" , &m , &n , &k) ;
	for(int i = 0 ; i < k ; i ++){
		for(int j = 0 ; j < n ; j ++) scanf("%d" , &num[j]) ;
		if(isVaild()) printf("YES\n") ;
		else printf("NO\n") ;
	}
	return 0 ;
}

posted @ 2021-08-23 23:04  凌宸1642  阅读(18)  评论(0编辑  收藏  举报