——>>暑假曾在汝佳神牛的白書上見過這題,原來在zoj上也有……順序序列與目標序列匹配,匹配上就轉到一節車廂;不能的話再用棧頂與目標序列匹配;也不能的話看順序序列能否放入棧中,能就繼續,不能就“No”。只可惜……“Yes”被我寫成了“YES”, ”No"被我寫成了“NO”,WA了3次!!!每塊後都加空行被我弄成了塊間加空行,又"PE"了一次......AC之路不容易的呀……
[cpp]
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1000 + 10;
int main()
{
int N, i;
int target[maxn]; //用來存目標序列
while(cin>>N)
{
if(N == 0) return 0;
while(cin>>target[1])
{
if(target[1] == 0) break; //一組測試結束
for(i = 2; i <= N; i++)
cin>>target[i];
stack<int> st;
int init = 1, cur = 1, ok = 1; //init為初始序列,即1,2,3...,cur為目標序列的下標,ok為能否轉換的標記
while(cur <= N) //一直到匹配完所有的車廂
{
if(init == target[cur]) //當駛來的車廂號與目標序列車廂號匹配時
{
init++; //轉到匹配下一節車廂
cur++; //轉到匹配下一節車廂
}
else if(!st.empty() && st.top() == target[cur]) //當棧中的車廂號與目標序列車廂號匹配時
{
st.pop(); //退棧,轉到匹配下一節車廂
cur++; //轉到匹配下一節車廂
}
else if(init <= N) //如果不相匹配但還沒到始入的最後一輛車廂時
{
st.push(init++); //駛入車廂進棧,且轉到下一節車廂
}
else //如果不相匹配且已到始入的最後一輛車廂時
{
ok = 0;
break;
}
}
if(ok) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
return 0;
}