UVA514
原题就不贴了。听别人讲的时候一头雾水,这东西果然还得自己悟,
只贴思路和解法:
火车从A到C再到B,流程基本是火车一定是从A开始先进到C,再根据情况判断是否和输入的出站顺序吻合。先设存储输入序列的数组为a
这里直接用STL的栈(就不造轮子了)来模拟C,从A到C直接PUSH,而每次从A到C的时候需要循环(是循环!)判断:C的栈顶是否符合序列a当前的元素,若符合则出栈且序列前进到下一个。最后根据a是否被遍历一遍作为判断输出YES或者NO就行了(也就是循环的时候设定的那个i是否走到了最后)。
下面是代码,需要注意的是原题的输出格式(很恶心。。。
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int a[1000];
int main()
{
stack<int> s;
int j=0;
int ii=0;
int n=0;
while(cin>>n&&n)
{
while(1)
{
j=0;
ii=0;
while(!s.empty()) s.pop();
cin>>a[0];
if(a[0]==0)break;
for(int i=1;i<n;i++)
cin>>a[i];
while(ii<n){
if(!s.empty()&&s.top()==a[j]){
j++;
s.pop();
}else{
s.push(ii+1);
ii++;
}
}
while(!s.empty()&&j<n){
if(a[j]==s.top()){
s.pop();
j++;
}else break;
}
if(j==n)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
return 0;
}