铁轨!!!!

来源:互联网 发布:手机黑科技软件 编辑:程序博客网 时间:2024/04/27 11:23

问题描述 :

某城市,有一个火车站,铁轨铺设如图所示,有n节车厢从A方向驶入车站,按照进站的顺序

编号为 1 ~ n ,你的任务是让他们按照某种特定的顺序进入B方向的铁轨,并使出车站,为了重组

车厢,你可以借用中转站C,这是一个可以停放任意多节车厢的车站,但由于末端封顶了,驶入C的车厢

必须按照相反的循序使出C,对于灭一个车厢,一旦从A进入C,既不能在回到A了,一旦C进入B,就不能

回到C了,换句话说,在任意的时刻,只有两种的选择, A->C : C->B



C车轨的形状是这个样子的.

输入结果:

5

1 2 3 4 5

5

5 4 1 2 3

6

6 5 4 3 2 1

----------

输出结果:

yes

no

yes




问题分析 :

一开始我要是拿到这样的一个题目,我就会想,我怎么能知道,他能按照答案的一样给我输出来


如果一个进入车站的顺序是,1~N,那么出站的顺序中,一定不会出现,1~N中的真子集,(前提这个真子集不能作为开头)


这样的话就可以写出一个伪代码了 :


首先需要记录,使出车站的数组A顺序.

创建一个栈B stack<int>B

进行一个while判断

A[a];

a = 1,b = 1;

1.while (a <= n);

2.数组A[a]和b是否相同 相同 : a++,b++ 不相同:执行3

3.数组A[a] 和栈B的栈头是否相同 && 栈不能为空  相同:出栈,a++ 不相同 : 执行4

4.b是否小于n 是 : 压入栈 否 :执行5

5.退出,这个出站顺序不成立




这是全部的代码:但是还有有一点要注意,在编写这个代码的过程中,在判断第二个if的时候,一定要注意

!empty() 先放在前面,这是因为在还没有压入栈的时候,栈中是没有任何元素的,这样就造成了,空栈拿数据

的情况,会导致段错误,如果 !empty放在前面就会避免这个问题,这是因为, 逻辑操作符的一个特性,如果

逻辑与 两个条件中有一个能决定这个操作的结果,他就不会进行下一步的运算.!empty在空栈时返回的是1,

!1就为0,这样就符合了逻辑与的特性,(逻辑与两个条件都是1才会放回1,如果其中一个是0,就会返回0)

这个操作就决定了以后的返回,他就不会在执行后面的语句了,也就不会从空栈中取出数据了,段错误也就不存在了




0 0
原创粉丝点击