算法竞赛入门经典第六章(例题) B - Rails(涉及到栈的运用)
题目:B - Rails
原题链接:https://cn.vjudge.net/contest...;
题目大意:先输入一个表示火车的节数,火车原本是按从1到n的顺序,但是一起进的还是分开进的是不一定的。之后输入自己的出站顺序,如果这个顺序可以实现,则输出yes,不能实现则输出no;
思路:利用栈的操作,即先将自己输入的第一个往后依次,先判断栈顶是否为空,如果为空,则从没用进入栈的火车头开始找,如果小于这个要找的元素,则进展,如果大于,则结束寻找,找完之后再判断其栈顶和自己找的是否一样(注意进栈的火车节不允许退出去),如果不为空则判断其栈顶是否一样,如果栈顶一样,则再从火车头中找比这个元素小的或者等于的入栈,最后比这个要找的元素小的或者等于全入栈之后,在判断其栈顶是否和要找的这个元素相同;(中间有些地方能直接判断不成立的,则可以直接退出)
代码:
#include<stdio.h> #include<string.h> int my_size=0; int mystack[1010]; int main() { int N; int a[1005],tag=0,temp=1,index; while(scanf("%d",&N)!=EOF&&N!=0) { while(1) { my_size=0;tag=0;temp=1; scanf("%d",&a[0]); if(a[0]==0) break; index=1; for(int i=1;i<N;i++) scanf("%d",&a[i]); for(int i=0;i<N;i++) { if(my_size==0) { if(index==a[i]) { index++; continue; } while(index<a[i]) { mystack[tag++]=index++;my_size++; } if(index>a[i]) temp=0; index++; } else { while(index<=N&&mystack[my_size-1]!=a[i]) { mystack[tag++]=index++; my_size++; } if(mystack[my_size-1]!=a[i]) { temp=0;} else {my_size--;tag--;} } if(temp==0) break; } if(temp) printf("Yes\n"); else printf("No\n"); } printf("\n"); } return 0; }
相关推荐
wl00 2020-10-28
EricNet 2020-07-05
EricNet 2020-05-27
何志文 2020-05-11
JOO 2020-04-26
happyfreeangel 2020-04-09
Poisedflw 2020-03-23
yangliuhbhd 2020-03-06
Ben的程序员生涯 2013-06-01
chenshuixian 2013-06-01
wes0 2014-05-31
mrice00 2019-12-20
EricNet 2019-12-11
89304896 2019-12-08
lihaoningxia 2013-07-09
userguanguan 2015-03-16