题意:火车车厢按1,2,3...的顺序进站,问车厢号是否能排成目标序列出站(栈结构)。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=259
——>>暑假曾在汝佳神牛的白书上见过这题,原来在zoj上也有……顺序序列与目标序列匹配,匹配上就转到一节车厢;不能的话再用栈顶与目标序列匹配;也不能的话看顺序序列能否放入栈中,能就继续,不能就“No”。只可惜……“Yes”被我写成了“YES”, ”No"被我写成了“NO”,WA了3次!!!每块后都加空行被我弄成了块间加空行,又"PE"了一次......AC之路不容易的呀……
#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; }