PAT (Advanced Level) 1051 Pop Sequence (模拟栈的操作)

一开始忘了栈空的时候也要push,结果一堆段错误,我以为是读入数字计数不对,改用vector先存发现没卵用,仔细看了看代码才突然意识到。。。

模拟这串数字的出入栈,如果当前读到的数字是7,那么7之前的数字肯定是在栈中或者在前一波中已经出栈了。

其中low就是来记录当前这一波入栈最小的值,然后每次入栈都判断下size是不是超过了m,超过即失败;以及如果当前的数字比low小,说明这个数字在前面已经被出栈了或是在栈中(不是栈顶元素),因此这种情况也是失败的。

#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;

int n,m,k;

int main(){
	scanf("%d%d%d",&m,&n,&k);
	int cnt, tmp, flag, low;
	vector<int> num;
	num.resize(n);
	while(k -- > 0){
		scanf("%d",&tmp);
		for(int i = 1; i < n; ++i)
			scanf("%d",&num[i]);
		stack<int> stk;
		cnt = 0;
		flag = 1;
		for(int i = 1; i <= tmp; ++i){
			stk.push(i);
			++cnt;
			if(cnt > m){
				flag = 0;
				break;
			}
		}
		if(!flag){
			printf("NO\n");
			continue;
		}
		low = stk.top() + 1;
		stk.pop();
		--cnt;
		for(int i = 1; i < n; ++i){
			tmp = num[i];
			if(!stk.empty() && tmp== stk.top()){
				stk.pop();
				--cnt;
			}
			else{
				for(int j = low; j < tmp; ++j){
					stk.push(j);
					++cnt;
					if(cnt >= m){
						flag = 0;
						break;
					}
				}
				if(low > tmp) flag = 0;
			}
			if(flag == 0) break;
			low = max(tmp + 1, low);
		}
		if(!flag) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值