原题:http://acm.hdu.edu.cn/showproblem.php?pid=1022
Train Problem I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18882 Accepted Submission(s): 7099



3 123 312
in
in
in
out
out
out
FINISH
No.
FINISH
其实关于这道题呢,难度还比上解析四则运算。我这里给大家分享下解题过程。火车进出站问题一般都要涉及到栈结构。本质就是进入过程能否和出去过程匹配的问题。分别把进入过程和出去过程放在两个数组。然后对进入过程设置指针p1,出去过程设置指针p2,如果p1==0,那么p1指向的车厢进入栈,如果p!=0;询问下栈顶元素和p2指向的车厢是否相等,相等就用while() pop();p2++;一直到栈为空或者stack.top()!=p2指向的车厢;一直到p1指到超过了最末尾车厢;“in”和“out可以在每次对栈结构操作时(pop()=>out,push()=>in),存放在一个string类型的数组里卖,最后如果栈是空的表示能够按照给你的出战顺序实现,那么输出Yes.步骤呢只要按照格式输出数组中的所有元素就可以了。如果栈不是空的,那就不行就输出No.
代码如下:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
int count;
while(cin>>count){
char num1[9],num2[9];
string op[100];
stack<char> st;
int j=0;
int p=0;
int cp=0;
for(int i=0;i<count;i++){
cin>>num1[i];
}
for(int i=0;i<count;i++){
cin>>num2[i];
}
while(p<=count){
if(!st.empty()){
if(st.top()==num2[j]){
while(!st.empty()&&st.top()==num2[j]){
st.pop();
op[cp++]="out";
j++;
}
if(p==count){
break;
}
}else{
st.push(num1[p++]);
op[cp++]="in";
}
}else{
st.push(num1[p++]);
op[cp++]="in";
}
}
if(!st.empty()){
cout<<"No."<<endl;
cout<<"FINISH"<<endl;
}else{
cout<<"Yes."<<endl;
for(int a=0;a<cp;a++){
cout<<op[a]<<endl;
}
cout<<"FINISH"<<endl;
}
}
return 0;
}