【第22期】观点:IT 行业加班,到底有没有价值?

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;
}


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

相关文章推荐

1051. Pop Sequence (25)

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

杭电 hdu 1051 Wooden Sticks

贪心问题,不过错了几次,我先将数据按重量进行排序,同时把重量相同的按长度进行排序。然后每处理一个木头,就向后搜索,查找所有可以符合题意的木头。并将已处理的木头进行标记,避免重复查找。 /* THE ROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// URL : http://acm

1051. Pop Sequence (25)-PAT

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

ACM题库以及培养策略

ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge。除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库。 USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU

【PAT】【Advanced Level】1051. Pop Sequence (25)

模拟,栈
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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