2021-12-3 学习的打卡学习第十一天(出栈序列的合法性)

本来今天是想总结一下动态规划和双指针的,但计划赶不上变化,今天有点忙。剩下的一小点时间我又去理解栈了。

关于出栈序列的合法性:

出栈序列中的每个数后面的比它小的数,是按递减排列的。

假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进栈之前,比i小的数一定已经进栈了。

所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小的数一定按严格递减排列.否则出栈系列不合法。

例题:

已知自然数 1,2,⋯,N(1≤N≤100)依次入栈,请问序列 C1​,C2​,⋯,CN​ 是否为合法的出栈序列。

输入格式

输入包含多组测试数据。

每组测试数据的第一行为整数 N(1≤N≤100),当 N=0 时,输入结束。

第二行为 N 个正整数,以空格隔开,为出栈序列。

输出格式

对于每组输入,输出结果为一行字符串。

如给出的序列是合法的出栈序列,则输出"Yes",否则输出"No"

Sample Input

5
3 4 2 1 5
5
3 5 1 4 2
0

Sample Output

Yes
No

代码如下:

#include<stdio.h>
#define N 1000
int main()
{
    int n,i=0,r=0,c,z;
    int a[N]={0};
    while(~scanf("%d",&n))
    {
        z=0;
        if(n==0)
            break;
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        for(i=0;i<n-1;i++)
        {
            for(r=i+1;r<n;r++)
            {
                if(a[i]>a[r])
                {
                    c=a[r];
                    break;
                }
            }
            for(r=i+1;r<n;r++)
            {
                if(a[i]>a[r])
                {
                  if(c<a[r])
                    z++;
                  else
                    c=a[r];
                }
            }
            if(z>0)
            {
                printf("No\n");
                break;
            }
        }
        if(z==0)
            printf("Yes\n");
    }
    return 0;
}

没错,我没有用栈算法来写,还不熟练。只能先用普通的方法表示出来了。

明天有课,抽空再学学吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值