2-10 出栈序列的合法性(20分)

例: 5 6 4 3 7 2 1        MaxStackSize=5        out        YES

第一个内循环获取单个判断序列,不能直接判断 ,可能造成部分数据无法吸收

演算纸上的思路大致写了一下,比较乱,不想看的话直接看下面的代码吧

begin 

5                judge_5 >> 0                 push        实际压栈为1~4 ,但要模拟也将5压栈

6                judge_5+1 == 6 (5为现在的max)        go

4                judge_max > 4               

                  judge_top == 4        pop        go

3                judge_max > 3

                  judge_top == 3        pop        go

7                judge_max+1 == 7

                  judge_stack.size > max        //continueJudge

2                judge_max>2        

                  judge_top==2        pop        go

1                judge_max>1        

                  judge_top==1        pop        go

out             stack.empty == true

                   "YES"

                   else        "NO"

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    int max,n,k,maxSc;
    cin>>max>>n>>k;
    int sc[n+1],num=0,err;//err为1时是有错
    stack<int> s;

    sc[0]=0;
    for(int I=0 ; I<k ; I++)
    {
        s=stack<int>();//清空栈操作
        maxSc=num=err=0;
        //获取出栈序列
        for(int i=1 ; i<=n ; i++)
        {
            cin>>sc[i];
        }

        //开始判断
        for(int i=1 ; i<=n ; i++)
        {
            if(maxSc+1 < sc[i])//need push
            {
                for(int j=maxSc+1; j<sc[i];j++)
                s.push(j);
                maxSc=sc[i];
                if(s.size()+1>max)//Full+
                {
                    err=1;
                    //printf("错误原因1 黑匣子入栈超出\n");
                    break;
                }

            }
            else if(maxSc+1 == sc[i])
            {
                maxSc++;
                if(s.size()+1>max)
                {
                    err=1;
                    //printf("错误原因2 模拟入栈超出\n");
                    break;//Full+
                }
            }
            else if(maxSc>sc[i])
            {
                if(sc[i]==s.top()&&!s.empty())
                    s.pop();
                else
                    {
                    err=1;
                    //printf("错误原因3 出栈错误\n");
                    break;//number error
                }
            }
        }
        if(s.empty()&& !err)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

(我在代码里在存放该序列时在序列最前加了一个0,这是个无用的操作,因为本来打算使用pre 和 now 做,但是存在缺陷,于是改成了判断已有序列的最大值,后来懒得删掉就留着他了)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值