02-线性结构3. Pop Sequence (25)

设置一个变量tmp,由1开始自增。当栈顶元素与输入的元素不匹配时将当前tmp入栈并tmp自加,当匹配时栈顶出栈。

来源:::http://blog.csdn.net/sup_heaven/article/details/20001385

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stack>  
  3. using namespace std;  
  4. int main(){  
  5.     int i,j,M,N,K;  
  6.     int input,tmp,flag;  
  7.     scanf("%d %d %d",&M,&N,&K);  
  8.     for(i=0;i<K;i++){  
  9.         flag=1;  
  10.         stack<int> ss;  
  11.         tmp=1;  
  12.         for(j=0;j<N;j++){  
  13.             scanf("%d",&input);  
  14.             while(flag){  
  15.                 if(ss.empty()||ss.top()!=input){  
  16.                     ss.push(tmp);  
  17.                     //printf("push:%d ",ss.top());  
  18.                     if(ss.size()>M){  
  19.                         flag=0;  
  20.                         break;  
  21.                     }  
  22.                     tmp++;  
  23.                 }  
  24.                 else if(ss.size()>=1&&ss.top()==input){  
  25.                     //printf("pop:%d\n",ss.top());  
  26.                     ss.pop();  
  27.                     break;  
  28.                 }  
  29.             }  
  30.         }  
  31.         if(ss.size()>0) flag=0;  
  32.         if(flag) printf("YES\n");  
  33.         else printf("NO\n");  
  34.     }  
  35.     return 0;  
  36. }

来源http://m.blog.csdn.net/blog/Debrus/38713053
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1005;
int m,len;

int check[N];
bool outside[N];
int main(){
	int i,k;
	scanf("%d%d%d",&m,&len,&k);
	while(k--){
		memset(outside,0,sizeof(outside));
		for(i=0;i<len;i++)
			scanf("%d",&check[i]);
		int last=0;
		for(i=0;i<len;i++){
			//printf("check %d\t",check[i]);
			if(outside[check[i]]){//不能输出已经输出过的数 
				//printf("condition 1\n"); 
				break;
			} 
			if(check[i]-i>m){//要输出这个数所需的栈长 不能超过m 
				//printf("condition 2\n"); 
				break;
			}
			if(last!=0&&check[i]<last){//若栈不为空,则不能输出比末尾小的数 
				//printf("condition 3\n"); 
				break;
			}
			
			outside[check[i]]=true;
			if(check[i]>last)
				last=check[i];
			while(outside[last])
					last--;
			//printf("last=%d\n",last);
		}
		if(i>=len)
			printf("YES\n");
		else
			printf("NO\n");
	}
	
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值