1051 Pop Sequence

原创 2015年11月21日 15:54:20

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

解题思路:

用栈来模拟整个过程的压入弹出,每次读入一个数字的时候,说明这个数字之前的数字都已经被压入过栈中了,要不是在栈中,要不就是压入栈后已经被弹出了。所以对于读取的第一个数,因为是第一个数,所以说明这个数之前的数字都没有被pop过。声明一个空栈,这个空栈从压入1开始,依次递增,直到压入的数和读取的第一个数相等,说明这个时候需要对栈进行pop操作,依次对读取的第二,第三。。。第n个数进行模拟。在模拟的过程中要判断,这个栈中的数据是否已经超过了栈的容量m如果已经超过了m那个就没有继续进行模拟的必要了。

#include<iostream>
#include<stack>
#include<stdio.h>
using namespace std;
int main(){
	for(int m,n,k;scanf("%d%d%d",&m,&n,&k)!= EOF;){
		while(k--){
			//定义一个空栈 add是模拟栈压入的时候的数 flag用来标记是否可行
			stack<int>sta;
			int flag = 1;
			int add = 1;
			for(int i = 0; i < n;i++){
				int num;
				scanf("%d",&num);
				if(flag){
					//当栈为空栈或者说是栈的元素还不等于读取的数字的时候,一直对栈进行push操作,中间判断栈容量是否超过
					while(sta.size() == 0 || sta.top() != num){
						sta.push(add);
						if(sta.size() > m){
							flag = 0;
							break;
						}
						add++;
					}
					if(flag && sta.size() >= 1 && sta.top() == num){
						sta.pop();
					}
				}
			}
			if(flag){
				printf("YES\n");
			}else{
				printf("NO\n");
			}
		}
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Pat(Advanced Level)Practice--1051(Pop Sequence)

Pat1051代码 题目描述:

PAT A 1051. Pop Sequence (25)

题目

1051. Pop Sequence (25)

堆栈有M个容量(后进先出),现在有M个数,判断的有K组 看是否可以把1~M 这些数通过入栈后出来得到某组,可以YES,反之NO。 这里一开始我弄错了,每个数必须要入栈再出来,比如最后一组数据, 当1...

pat1051Pop Sequence (25)

题意分析: (1)给出若干个从1到N的排列,并且给出栈的深度,问这些排列是否是从1到N的出栈序列 (2)判断一个序列是否是一个出栈序列受栈的深度、出入栈的顺序的制约:若入栈个数大于栈的最大深度,则此种...

PAT 1051. Pop Sequence (25)

1051. Pop Sequence (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B ...

PAT A1051. 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 p...

1051.Pop Sequence

【题意】         对于最大深度给定的栈,判断几个序列是否可能为入栈顺序为1到n的序列对应的出栈序列 【思路】         1.    对于出栈序列中的任一个数,在它后面出栈的...

1051. Pop Sequence

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p...

【PAT】1051. Pop Sequence (25)

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1051 题目描述: Given a stack which can keep M n...

PAT 1051. Pop Sequence (25)

//1051. Pop Sequence (25) //一定记得进行完之后要将所有的元素都pop出来才能得到正确结果。 //acc #include #include using namespac...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)