Pop Sequence【pta】

题目要求:
在这里插入图片描述
给定样例:
在这里插入图片描述
做题思路:

本题思想是手动模拟出栈的过程,看看最后是否合法:假设有最开始入栈序列,给你一个出栈序列,有以下几种情况:
1)栈为空,入栈序列不为空,则入栈,入栈序列-1,堆栈长度+12)栈顶元素与出栈元素相等,出栈,出栈元素往后移,堆栈长度-13)栈顶元素与出栈元素不相等,如果入栈序列不为空,则再入栈,入栈序列-1,堆栈长度+1;
循环上面三个过程,如果同时满足堆栈为空,入栈序列,出栈序列都处理完了,则说明给定的出栈序列合法。
注意!!!如果堆栈最大长度有要求的话,要在循环里面判断会不会超过,还有出栈入栈也不能超过给定的长度。

代码实现:

#include<stdio.h>
int isyes(int *a, int n,int m)//a是要判断的出栈序列,n是序列长度,m是堆栈的最大长度
{
    int b[1000];
    int c[1000];//模仿堆栈
    for (int i = 0; i < n; i++)
        b[i] = i + 1;//1,2,3,4....//要入栈的序列
    int i1=0;//记录入栈序列
    int l2=0;//记录堆栈里面的长度
    c[l2++]=b[i1++];//第一个入栈
    int i=0;//记录出栈序列
    while(l2||i<n||i1<n)//如果堆栈为空,且都处理到头了
    {
        if(l2==0){//堆栈为空
           c[l2++]=b[i1++];
        }
        if(a[i]==c[l2-1])//如果相同
        {
            i++;//往后移一位
            l2--;//出栈,堆栈长度-1
        }
        else {
            c[l2++]=b[i1++];//入栈
        }
        if(i>n||i1>n||l2>m)return 0;//如果堆栈长度超过最大长度,要入栈,要出栈的位置不合法,都是直接退出
    }
    return 1;


}

int main() {
    int m, k, n;
    int a[100][100];//用来记出栈序列
    scanf("%d %d %d", &m, &n, &k);
    for (int j = 0; j < k; j++) {
        for (int i = 0; i < n; i++)
            scanf("%d", &a[j][i]);//全部输入
        if (isyes(a[j], n,m))printf("YES\n");
        else printf("NO\n");
    }
}

记录一下我的写题过程哈哈,有更好思路欢迎提出来呀!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值