杭电ACM1022Train Problem I
2016-06-28 17:38
190 查看
题目地址: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;
}
解题思路:针对每一个火车,有入站出站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;
}
相关文章推荐
- C++基于栈实现铁轨问题
- 浅析C语言中堆和栈的区别
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- java数据结构之java实现栈
- 浅析栈区和堆区内存分配的区别
- 用Java代码实现栈数据结构的基本方法归纳
- 用PHP解决的一个栈的面试题
- 浅谈C#中堆和栈的区别(附上图解)
- JavaScript数据结构与算法之栈详解
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
- Python实现栈的方法
- JavaScript数组的栈方法与队列方法详解
- JavaScript数据结构与算法之栈与队列
- JavaScipt中栈的实现方法
- Java中堆和栈的区别详解
- 详解Java的堆内存与栈内存的存储机制