会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
creativity
To find a kindred spirit is not easy...
博客园
首页
新随笔
管理
hdu 1022 Train Problem I 栈
Code
/**/
/*
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
;
}
posted @
2008-12-21 15:36
sunjian
阅读(
233
) 评论(
0
)
收藏
举报
刷新页面
返回顶部
公告