大家好,初次见面。
那么,让我们先来看一下题目。
题目描述
n列火车按照1,2,3… …n的顺序进站,那么出站的顺序可能是下面的序列吗,如果能输出Yes,否则输出No
输入
第一行一个整数n(n<=1000)
第二行n个整数,为出站序列
输出
Yes 或者No
样例输入
5
5 4 1 2 3
样例输出
No
好了。
这是个关于出栈顺序的问题。题目中规定了进栈的顺序是一定的,因此不同时间的出栈导致了最终的出栈顺序的不同。解决这个问题,我们可以模拟整个过程。请记住,栈有先进后出,后进先出的性质。
好了,我们先开一个栈。
int a[1010],n;
int top=0;
a是我们的出栈顺序,n是火车的数量,top是我们的栈顶(并不需要把栈都存起来,此题从1,2,一直到n的进站顺序特性使我们只用一个top就可以知道栈里的元素都是啥)。
接下来我们输入将要判断的出栈顺序。
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
然后是关键环节,判断此出栈顺序是否合法(废话)。
要知道,刚开始我们的火车站里是没车的,必须往里开车(不,不是蓝色链接)才行,拿题目样例输入举例,第一个开出的车是5,而我们入站的顺序一定,所以,我们必须先让1号车,然后让2号车进站,一直到5号车进站,才能使第一个出站的车为五号车。
推广一下,如果想让m号车出站,就必须一号二号一直到m号都进站。
while(top!=a[1])
{top++;}
我们先保证第一位出站的车编号对上,其他的之后慢慢考虑。
这一步可以称之为预处理,下一步是判断。
(敲黑板)如果你现在的栈顶车编号就是对应的出栈顺序的车的编好,皆大欢喜,判断下一个出栈的车编号和你的栈里的下一位。
而如果你的栈顶元素大于对应的出栈的车编号,说明本应该出站的车被压在了底下,而栈是没法让它出去的(除非你是铁但火车侠),因此直接可知这个出站顺序不合法。 输出并结束程序。
最后一种情况,栈顶元素小于你要出站的车编号,说明你要出站的车还没进站,再重复你最开始的进站操作,并把i–,以便下次从此位继续检测。
判断代码如下
for(int i=1;i<=n;i++)
{
if(top==a[i])
{
top--;
}
else if(top>a[i])
{
printf("No");
return 0;
}
else
{
while(top!=a[i])
{top++;}
i--;
}
}
而如果都判断完了后你的程序还在运行,证明你的出站顺序合法,输出yes并欢呼吧,不会发生火车相撞的事故。
printf("Yes");
完整代码如下:
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a[1010],n;
int top=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
while(top!=a[1])
{top++;}
for(int i=1;i<=n;i++)
{
if(top==a[i])
{
top--;
}
else if(top>a[i])
{
printf("No");
return 0;
}
else
{
while(top!=a[i])
{top++;}
i--;
}
}
printf("Yes");
}
好了今天的首次讲题就到这里,第一次与大家见面还是自我介绍一下,我叫霞客88,又弱又水的辣鸡一枚哈(但还是想成为dalao),以后可能会是=时不时写点啥,写的不好还请各位见谅。
关于这题有什么不懂的诸位可以提,我尽量解答,我有什么错误,疏忽,漏洞也欢迎大家指出,大家共同进步共同发展,初次见面多多包涵。
那么,祝您身体健康(提乾涉经),再见。