hdu 1022 Train Problem I 栈

/**//*
2008-12-21 14:55:18 Accepted 1022 0MS 0K 879 B
这是一道比较简单的题,主要用到的栈的知识
我的思路是这样的:
有两个序列od1和od2,分别表示火车进来的次序和火车要出站的顺序。j和i分别代表了它们当前的位置,用一个栈sk,和一个记录in和out顺序的队列
1.如果此时栈为空或者当前的栈顶元素不等于od2[i],就是od1[j]入栈,j加1,同时记录这个"in"的事件(把它放入队列)。
2.假如此时栈顶元素刚好等于od2[i],就弹出栈顶元素,记录这个"out"的事件,同时i加1
不断进行上面上面两个判断,直到两个数组遍历完,或者在中途中达不到目标顺序,使程序停止。
*/
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
#define N 11
int n;
int od1[N],od2[N];
void mkans()

{
stack<int>sk;
queue<int>q;
for(int i=0,j=0;i<n&&j<=n;)//本程序的核心
{
if(sk.empty() || sk.top()!=od2[i])//上面注释中的第一种情况
{
if(j==n)//如果数组od1已遍历完毕,而栈顶元素与od2的当前元素不符,则永远达不到目标顺序
{
puts("No.\nFINISH");
return;
}
sk.push(od1[j++]);//入栈
q.push(-1);//表示记录"in"
}
else
{
sk.pop();//入栈
q.push(1);//表示记录"out"
i++;
}
}
/**//*----------------------------------*///在yes的情况下输出in和out的过程
puts("Yes.");
while(!q.empty())
{
int tmp;
tmp=q.front();
if(tmp<0)
puts("in");
else
puts("out");
q.pop();
}
puts("FINISH");
/**//*----------------------------------*/
}
void init()//初始化的输入

{
for(int i=0;i<n;i++)
od1[i]=getchar()-'0';
getchar();
for(i=0;i<n;i++)
od2[i]=getchar()-'0';
}
int main()

{
while(scanf("%d ",&n)!=EOF)
{
init();
mkans();
}
return 0;
}
浙公网安备 33010602011771号