出栈顺序问题

大家好,初次见面。
那么,让我们先来看一下题目。
题目描述
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),以后可能会是=时不时写点啥,写的不好还请各位见谅。
关于这题有什么不懂的诸位可以提,我尽量解答,我有什么错误,疏忽,漏洞也欢迎大家指出,大家共同进步共同发展,初次见面多多包涵。
那么,祝您身体健康(提乾涉经),再见。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值