列车长的烦恼

昨天有人给发我了这样的代码,计算列车长的烦恼问题。此代码可以正常运行,且计算正确,代码非常短。

int main()

{

scanf("%d",&cases);

while(cases--)

{

scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]);

top=0;p=1;aa=1;stack[0]=-1;

while(p<n+1)

{

stack[++top]=p;p++;

while(stack[top]==a[aa]) { top--;aa++; }

}

if(top==0) printf("Yes/n"); else printf("No/n");

}

return 0;

}

对代码分析后,初步结论:

一、代码短小原因

1.未构造类作为栈,而是只用数组stack和下表top进行操作,其实一个简单的栈也正是包含这两个因素。这样会单单是栈就会减少10行左右的代码。但是,这样的设计并不影响本质,即:自己构造一个完备的栈类丝毫不必直接使用数组会差,故并不推荐直接数组。直接使用数组在问题简单的情况下是可以的,但是问题复杂后,直接使用数组就不再那么有效。起码会让人觉得很累。(分析结果:不推荐此方法)

2.在判断分支时不够全面详细,虽然代码可以正确完成任务,但由于判断分支存在缺漏,会导致程序判断效率不高。代码短效率反而不高?是的,因为缺少了判断分支,某些情况下没有及时得出结果,而是简单的去判断下一个。后面我将画出此代码的流程图参考。(分析结果:简化了判断分支,代码短小但导致了效率的降低)

3.部分代码将多行代码写到一行中,看上去比实际的更短。(分析结果:不推荐此方法)

4.部分变量名用简单的apaa,这种无确切含义的短名字,使代码看上去比实际的更短。(分析结果:不推荐此方法)

二、此代码核心算法与结构图

第一步:车厢进栈(因为是首节车厢,栈为空,除了进栈外别无选择)

第二步:比对栈顶车厢是否同输出序列车厢相符,若相符则出栈,比对序列车厢下一个

第三步: 继续进行第二步,直到出现不相等情况。

第四步:出现不相等时,回到第一步,右边车厢进栈(直到超出输入的车厢总数目)

第五步:判断栈内是否为空,为空则正确,不为空说明出错。

归纳一句话,比对是否相等,若相等则出栈,若不等则进栈。

因为栈来说,要么进栈要么出栈。车厢来说要么进来,要么出去。所以程序逻辑认为,如果比对不相符,那么一定需要进栈,如果相符那么出栈。这是正常的情况确实这样。但如果输出序列是错误的呢?

比如大家直到312是个不可能的序列,按照以上逻辑,一开始比对数字是3

1:进栈。                 栈内数据:1

2:比对,3=1,继续进栈。栈内数据:1,2

3:比对,3=2,继续进栈。栈内数据:1,2,3

4:比对,3==3,出栈,     栈内数据:1,2

5:比对1=2(因为输出序列第一个3已经匹配,继续比对输出序列下一个1,栈顶为2,比对不符)    ,进栈,    因为总数是3,已无车厢进栈。结束判断。

6:判断栈是否为空,栈内元素为1,2,显然不为空,故判断出此序列是错误的。

int a[110],stack[110],cases,n,i,p,top,aa;

三、程序存在问题举例:由于312是不可能序列,若输出序列为:3,1,2,4,5,6,7,8,9.。。。。。。

一个比较长的序列,假设有100节车厢,输出序列是前面是3,1,2,后面都是按序拍好的(或者随意排的)。

我们期望是当看到312,时就已经能够判断出错,而不必再去判断后面序列,及时退出给出结果。而按照此简洁算法逻辑执行如下:

1:进栈。                 栈内数据:1

2:比对,3=1,继续进栈。栈内数据:1,2

3:比对,3=2,继续进栈。栈内数据:1,2,3

4:比对,3==3,出栈,     栈内数据:1,2

5:比对1=2(因为输出序列第一个3已经匹配,继续比对输出序列下一个1,栈顶为2,比对不符)    ,进栈,    栈内数据:1,2,4

6:继续比对1=4,进栈, 栈内数据:1,2,4,5

7:继续比对1=5,进栈, 栈内数据:1,2,4,5,6

8:继续比对1=6,进栈, 栈内数据:1,2,4,5,6

9:继续比对1=7,进栈, 栈内数据:1,2,4,5,6,7

。。。。。。。

一直比对到100,最后栈内数据是:1,2,4,5,6,7.。。。。。。100

程序最后判断栈是否为空,结果栈内确实很满,此时才给出不匹配的结论。。。。。

其实我们是期望在第5处就能及时发现不匹配,而不用再往下进行了。能够及时退出的算法即流程图上次我已经发给你了,可以作为参考。就是多出2个判断分支。这里只做相等的判断,在那里我还做了大于,小于的情况分别进行判断,能够最快的得出结论。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
列车长是铁路运输中的一个重要职位,他们负责管理和领导列车运行,确保旅客和货物的安全和顺利运输。在工作中,列车长需要具备丰富的专业知识和技能,同时还需要具备较强的大局意识。下面,本文将从不同方面探讨列车长的大局意识的体现。 一、安全第一 作为列车运输的管理者,列车长必须时刻保持安全第一的意识。在列车长的工作中,他们需要严格遵守铁路交通安全规定,把安全工作放在首位,坚持以人民群众生命财产安全为中心,确保旅客和货物的安全运输。在遇到突发情况时,列车长需要迅速反应,采取果断措施,及时保护旅客和货物的安全,避免事故的发生。 二、紧急情况的处置 列车长在工作中需要具备处理紧急情况的能力,必须能够快速反应,及时处理突发事件,保障旅客和货物的安全。例如,在列车行驶过程中,如果发现火灾、车辆故障等紧急情况,列车长需要迅速采取措施,通知相关部门,组织乘务人员和旅客疏散,及时处理突发事件。 三、对乘务人员的管理 列车长是乘务人员的领导者,需要对乘务人员进行培训和管理,确保他们严格遵守铁路交通安全规定,保障旅客和货物的安全。在工作中,列车长需要关注乘务人员的工作状态和工作效率,及时解决问题,提高工作效率。同时,列车长还需要对乘务人员进行带教和培训,提高他们的专业知识和技能水平。 四、对车辆的管理 列车长需要对车辆进行管理,确保车辆的运行安全和顺畅。在工作中,列车长需要对车辆进行定期检查,发现问题及时处理,保障车辆的正常运行。此外,列车长还需要对车辆进行维护和保养,确保车辆的性能和使用寿命。 五、对旅客的服务 列车长在工作中需要关注旅客的需求和服务,提供优质的服务,确保旅客的出行体验。列车长需要关注旅客的安全和舒适度,关注旅客的饮食和休息等需求,提供周到的服务。此外,列车长还需要关注旅客的意见和建议,及时改进服务,提高旅客的满意度。 六、对铁路运输大局的把握 列车长需要具备较强的大局意识,关注铁路运输的整体发展情况,了解国家铁路运输政策和规划,把握铁路运输的大势和趋势。在工作中,列车长需要根据铁路运输的发展情况,制定合理的运输计划,提高运输效率和运输能力,推动铁路运输的发展。 总之,列车长是铁路运输中的重要职位,他们需要具备丰富的专业知识和技能,同时还需要具备较强的大局意识。只有不断提高自身素质,关注铁路运输的整体发展情况,才能更好地完成工作任务,推动铁路运输的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值