1051 Pop Sequence

模拟操作,昨晚脑子都糊了,今早还是要1个小时才想明白

注意发现序列错误时,仍要读完该行输入,不能break, 否则影响下一行输入的读取

#include <stdio.h>
#include <stack>
using namespace std;
int m,n,k;

stack<int> s;

int main(){
	freopen("in.txt","r",stdin);

	scanf("%d%d%d",&m,&n,&k);

	bool isValid;
	
	

	for(int i = 0; i < k; i++){

		isValid = true;
		while(!s.empty()){//每次清空栈
			s.pop();
		}
		
		int top;
		int len;
		int lastPush = 0;//上一个入栈的元素

		for(int j = 0; j < n; j++){
			int ele;
			scanf("%d", &ele);//不管是否发现错误,要读入

			if(isValid){
				top = s.empty() ? 0 : s.top();//当前栈顶
				len = s.size();					

				if( ele == top){ 
					lastPush = ele > lastPush ? ele : lastPush;
					s.pop();

				}else if(ele > top){
					if(ele-lastPush+len > m){
						isValid = false;
						//break;	//这里不能退出循环,否则非法序列剩下的值没有读入,影响下一行的输入
					}				
					for(int k = lastPush+1; k <= ele; k++){
						s.push(k);
					}
					lastPush = ele;
					s.pop();

				}else{//出栈元素 小于 当前栈顶 ,错误
					
					isValid = false;
					 
				}
			
			}

		}

		if(isValid){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
		
		 
	}


	return 0;
}


你可能感兴趣的:(1051 Pop Sequence)