/*
Note:
题意:
有n节车厢(编号1~n),从A站驶入,经过中转站C能不能按照所给顺序target驶出中转站
一开始输入n代表n节车厢,然后输入出站顺序target[],如果能按出站顺序出站则输出Yes,否则No
0代表着处理n节车厢结束,然后重新输入n,如果n=0,结束program
*/
#include<cstdio>
#include<stack>
using namespace std;
const int Max = 1010;
int target[Max],n;
stack<int> s;
bool OK(){
while(!s.empty()) //初始化栈
s.pop();
int k=1,p=1; //k控制A站进入C的车厢,p控制C站出去的车厢
while(k<=n && p<=n){
if(k==target[p])
k++, p++;
else if(!s.empty() && s.top()==target[p]){
s.pop();
p++;
}
else{
s.push(k);
k++;
}
}
while(!s.empty() && p<=n){
if(s.top()==target[p]){
s.pop();
p++;
}
else
break;
}
if(p==n+1) //如果全部能按target[]出站返回true
return true;
else
return false;
}
int main(){
bool flag;
while(scanf("%d",&n)!=EOF && n){
flag=true;
while(true){
for(int i=1;i<=n;i++){
scanf("%d",&target[i]);
if(!target[i]){ //如果target[]为0则可以重新输出n
flag=false;
break;
}
}
if(!flag) break;
printf("%s\n",OK()?"Yes":"No");
}
printf("\n"); //每次处理完n需要输出一个空行
}
}
/*
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
*/
Uva 514 Rails(简单栈)
最新推荐文章于 2021-11-06 15:05:54 发布