本题可以利用栈作为中间工具,就是判断从1-n的序列经过栈处理之后是否能够变成c序列,所以将1-n一次入栈,如果栈顶数字等于c序列的数字,就出栈,这样遍历之后,如果两个序列都能遍历完成,那么就可以,否则,不可以
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<stack>
using namespace std;
int main(){
int n;
while(cin >> n){
if(n==0) return 0;
int a[200];
int b[200];
for(int i=1;i<=n;i++){
a[i]=i;
}
for(int i=1;i<=n;i++){
cin >>b[i];
}
stack<int> s;
int i=1,j=1;
while(i<=n){
//a序列依次入栈,判断依据是栈顶元素不饿等于b序列开头
while(s.empty() || s.top()!=b[j]){
s.push(a[i++]);
if(i>n) break;
}
//如果栈顶元素等于b序列开头,就出战
while(!s.empty()&&s.top()==b[j]){
s.pop();
j++;
if(j>n) break;
}
//如果连个序列全部遍历完成,就表示满足
if(i>n || j>n) break;
}
if(i>n && j>n){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}