告訴你一個入棧隊列和一個出棧隊列,當然這一個隊列裏邊不容許出現一樣的數,判斷這個出棧隊列是不是合理的出站隊列。。。
比如說告訴你一個入棧隊列,1 2 3 4 5 6,當然這個不一定是這樣單調遞增的,還告訴你一個出站隊列1 2 5 6 4 3,結果是yes,
但是如果告訴的入棧隊列是1 2 3 4 5 6,出站隊列是4 3 6 1 2 5那是不可能有這樣的出站隊列的,所以輸出no。
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
bool solve(int a[],int b[],int n){
//a數組是出棧隊列,b數組是入棧隊列,n是a和b的數組大小
int ok=false;
if(!n)return ok;
int i=0,j=0;
stack<int> s;
while(j<n){
while(i<n&&b[i]!=a[j]){
s.push(b[i]);i++;
}
i++;j++;
while(!s.empty()&&j<n){
int top = 0;
top=s.top();
s.pop();
if (top == a[j]) {
j++;
} else {
s.push(top);
break;
}
}
if(i>=n&&s.empty()){ok=true;return ok;}
}
// while(i<n){//豬似的這部分是隻適用於b數組(入棧隊列)是單調遞增的,這個是自己寫的!!!
// while(j<n&&a[i]>b[j]){
// s.push(b[j]);
// j++;
// }
// if(a[i]>b[j])return false;
// while(a[i]==b[j]&&j<n){i++;j++;}
// if(j==n){
// if(i<n)
// {
// while(!s.empty()){
// int t=s.top();
// if(t!=a[i++])return false;
// s.pop();
// }
// return true;
// }
// else{
// if(!s.empty())return false;
// else return true;
// }
// }
// if(a[i]<b[j])
// {
// if(!s.empty())
// {
// int t=s.top();
// if(t!=a[i])return false;
// s.pop();
// i++;
// }
// else return false;
// }
// }
// if(j<n)return false;
// if(!s.empty())return false;
return ok;
}
int a[1010],b[1010],n;
int main(){
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)b[i]=i+1;
if(solve(a,b,n)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}