题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1022
解题思路:针对每一个火车,有入站出站2种状态,判断是否入站条件为:首先栈为空,入栈;再次栈不为空并且顶栈元素不等于出栈的序列元素,出栈条件:栈不为空,栈顶元素等于出站序列;记录出入状态用记录数组(大小是2倍序列)数组中下标用2个变量控制的巧妙运用;最后用战是否为空来判断出站序列是否合理;(合理为空)并输出出入状态;
- #include <iostream>
- #include <stack>
- using namespace std;
- int main()
- {
- int n;
- char in[100];
- char out[100];
- int flag[100]; //记录判断进站还是出站的标志
- while(cin>>n)
- {
- cin>>in;
- cin>>out;
- stack<char> s;//模拟站台的栈
- int i=0; //i代表进站序列的对应列车
- int j=0; //j代表出站序列的对应列车
- for(i;i<=n;)
- {
- if(s.empty()) //如果栈为空则处理第一个数据
- {
- s.push(in[i]);
- flag[i+j] = 0;
- i++; //第一个数据入栈,计数器加一
- }
- if(!s.empty()&&s.top()!=out[j])//如果栈不空并且不等于当前出站序列中的数字,则必须再将后面的标号入栈
- {
- s.push(in[i]);
- flag[i+j] = 0;
- i++;
- }
- if(!s.empty()&&s.top()==out[j])
- {
- s.pop();
- flag[i+j] = 1;
- j++;
- } //如果栈不为空,并且栈顶元素等于当前出站序列中的当前位置,则出栈,并让出站序列向后,开始处理下一个出站序列
- }
- if(s.empty()) //若栈为空,证明全部列车都已经出站,所以题目给出的出站序列有可能实现
- {
- cout<<"Yes."<<endl;
- for(i=0;i<2*n;i++)
- {
- if(flag[i]!=1)cout<<"in"<<endl;
- else cout<<"out"<<endl;
- }
- cout<<"FINISH"<<endl;
- }
- else //若栈不为空,说明有列车滞留在车站中,肯定不能实现题目给出的出站序列
- {
- cout<<"No."<<endl;
- cout<<"FINISH"<<endl;
- }
- }
- return 0;
- }