PAT:1051. Pop Sequence (25) AC

本文介绍了一个使用 C++ 实现的算法,该算法用于判断给定序列是否可以通过一系列操作从一个空栈中得到。通过输入栈的容量、序列的长度及查询次数等参数,程序能够判断并输出每个查询序列是否合法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;

stack<int> str;      
int putin[1010];    //暂存查询的序列
int main()
{
  int m,n,k;        //栈容量m,栈序列1-n,查询k次
  scanf("%d%d%d",&m,&n,&k);
  while(k--)        //【skill】查询k次
  {
    while(!str.empty())  //清空栈,万一上一轮元素没有pop空,会受到上一次的影响。pop前必须判空!
      str.pop();
    memset(putin,0,sizeof(putin));
    for(int i=1 ; i<=n ; ++i)    //每次查询序列有n个数
    {
      scanf("%d",&putin[i]);
    }
    int index=1;    //指向查询序列待查位置
    bool ans=1;      //标记本序列是否合法
    for(int i=1 ; i<=n ; ++i)
    {
      str.push(i);  //进栈
      if(str.size()>m)
      {
        ans=0;    //失败1:栈爆了,标记不合法
        break;
      }
      while(!str.empty() && str.top()==putin[index])  //栈顶元素就是序列需求的数
      {              //【warning】“!str.empty()”不能另在下面写if判断,因为空的时候str.top()是无效的,会报错!
        str.pop();        //弹出这个数
        ++index;        //需求数为下一个
      }
    }
    if(!str.empty())    //【caution】失败2:全部都判断过居然没有输出完,肯定有问题。原因(序列里进出的数可能不是连号的)
      ans=0;
    if(1==ans)
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}

转载于:https://www.cnblogs.com/Evence/p/4319249.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值