【1051】Pop Sequence (stack)

简介: 出栈是否合法要满足:(1)能出栈(2)不超过栈的限制容量。思路:模拟,将1~n依次入栈,在入栈中——如果入栈的元素恰好等于出栈序列当前等待出栈的元素,就让栈顶元素出栈,同时把出栈序列当前等待出栈的元素位置标记后移1位。——举个栗子:出栈顺序为3 2 1 7 5 6 4时,1入

1.题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944

给出容量max=M的栈,分别把1、2、…、n依次入栈,并给出一些列出栈顺序,判读判断出栈顺序是否合法。

2.思路

出栈是否合法要满足:(1)能出栈(2)不超过栈的限制容量。

思路:模拟,将1~n依次入栈,在入栈中——如果入栈的元素恰好等于出栈序列当前等待出栈的元素,就让栈顶元素出栈,同时把出栈序列当前等待出栈的元素位置标记后移1位。

——举个栗子:出栈顺序为3 2 1 7 5 6 4时,1入栈,2入栈,3入栈,3出栈,1出栈,4出栈,5入栈,6入栈,7入栈,7出栈,此时栈的顶端元素为5,而序列要求此时6出栈(不可能),所以输出“NO”。

此时只要栈顶元素仍然等于出栈序列当前等待出栈的元素,则持续出栈。

(1)初始化栈,读入需要测试的出栈序列。

——以bool型变量flag表示出栈序列是否合法,若flag==true,则表示出栈序列合法,flag变量的初值为true。

以int型变量current表示出栈序列当前等待出栈的元素位置标记,初值=1;

(2)由于入栈顺序为1~N,因此从1至N枚举i,对于每个i,先将i入栈。如果此时栈内元素数目大于m个,则违反规则,置flag=false,退出循环;

否则,反复判断当前current所指出出栈序列中的元素(即带出栈元素)是否等于栈顶元素,若是,则让该元素出栈,并让current自增以指向下一个待出栈元素。

(3)如果上述操作结束后栈空且flag ==true,则说明出栈顺序合法,输出“YES”,否则输出“NO”。

3.代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>  
#include <stack>
using namespace std;  
const int maxn=1010;
int arr[maxn]; //保存题目给定的出栈序列
stack<int> st;  //定义栈st,用以存放int型元素
int main(){   
  int m,n,T;
  scanf("%d%d%d",&m,&n,&T);
  while(T--){   //循环执行T次
    while(!st.empty()) {  //清空栈
      st.pop();
    }
    for(int i=1;i<=n;i++){
      scanf("%d",&arr[i]);
    }
    int current=1; //指向出栈序列中的待出栈元素
    bool flag=true;
    for(int i=1;i<=n;i++){
      st.push(i); //把i压入栈
      if(st.size()>m){ //如果此时栈中元素个数大于容量m,则序列非法
        flag=false;
        break;
      }
      //栈顶元素与出栈序列当前位置的元素相同时
      while(!st.empty()&&st.top()==arr[current]){
        st.pop();//反复弹栈并令current++
        current++;
      }
    }
    if(st.empty()==true&&flag==true){
      printf("YES\n"); //栈空且flag==true时表明合法
    }else{
      printf("NO\n");
    }
  }
  return 0;   
}

4.注意点

(1)题目对栈的大小有限制。

(2)在pop和top操作前记得判空,否则OJ会返回“答案错误”或“段错误”。

(3)步骤3必须判断是否栈空,否则会返回“答案错误”——因为如果在所有元素入栈后无法将所有元素出栈是不合法的。

(4)在每个出栈序列输入前一定要清空栈,否则如果上个出栈序列的结果没有被清空,会影响下个出栈序列的过程。

相关文章
|
Ubuntu Windows
教你彻底卸载Ubuntu双系统,去污不残留
教你彻底卸载Ubuntu双系统,去污不残留
5012 0
教你彻底卸载Ubuntu双系统,去污不残留
|
缓存 开发工具 git
【git】解决:remote: Permission to xxxx/xxxx.git denied to xxxx
【git】解决:remote: Permission to xxxx/xxxx.git denied to xxxx
1401 0
|
JSON 前端开发 开发工具
初探在WSL中设置vim前端开发环境
初探在WSL中设置vim前端开发环境
|
12月前
|
存储 运维 监控
云服务运维智能时代:阿里云操作系统控制台
阿里云操作系统控制台是一款创新的云服务器运维工具,采用智能化和可视化方式简化运维工作。通过AI技术实时监控服务器状态,自动分析性能瓶颈和故障原因,生成详细的诊断报告与优化建议。用户无需复杂命令行操作,仅需通过图形化界面即可高效处理问题,降低技术门槛并提升故障处理效率。尤其在服务器宕机等紧急情况下,智能诊断工具能快速定位问题根源,确保业务稳定运行。此外,控制台还提供内存、存储、网络等专项诊断功能,帮助用户全面了解系统资源使用情况,进一步优化服务器性能。这种智能化运维方式不仅提升了工作效率,也让个人开发者和企业用户能够更专注于核心业务的发展。
|
6月前
|
安全 Linux 网络安全
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
614 0
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
413 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
8月前
|
存储 缓存 分布式计算
阿里云服务器热门实例选择指南:经济型/通用型/计算型性能解析与场景适配
当我们通过阿里云的活动选购云服务器时,常常会面临一个令人困惑的选择:相同配置的云服务器,为何存在多个不同的实例类型,且价格差异显著。这背后的原因在于不同实例规格采用了各异的处理器和底层架构,例如常见的X86计算架构与Arm计算架构,这些差异直接导致了云服务器在性能表现和适用场景上的不同。本文将为大家深入剖析阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,以供选择参考。
|
12月前
|
机器学习/深度学习 人工智能 运维
即刻拥有DeepSeek-R1满血版:开启云端算力新时代,赋能企业无限可能
DeepSeek-R1满血版云服务器,搭载最新Intel/AMD处理器和NVIDIA顶级GPU,算力提升300%,支持AI训练、大数据分析等高负载任务。具备弹性扩展、按需付费、99.99%高可用性及全方位安全防护,适用于AI、游戏、金融、电商、科研等场景,助力企业轻松驾驭数字化未来。新用户享首单5折、免费试用7天等优惠。立即注册,体验极致性能!
415 11
|
存储 机器学习/深度学习 网络协议
阿里云企业级ARM计算规格族简介:特点、场景与价格参考
Arm计算是指基于 ARM 架构的处理器进行的计算,本文将为您解析阿里云ARM云服务器的特点、适用场景,以及最新价格情况,以供了解和参考。
|
Shell Linux 开发工具
Windows Terminal——安装并配置主题
Windows Terminal——安装并配置主题
273 1
Windows Terminal——安装并配置主题

热门文章

最新文章