出栈的合法性检测

2023-11-14

对于一个给定的入栈顺序,可能的出栈顺序会有很多,但是肯定都要遵循栈“后进先出”的特点,那么怎么进行合法性检测呢?

算法思想如下:

  1. 定义变量InIndex标记入栈序列的当前位置,定义OutIndex标记出栈序列的当前位置
  2. 对InIndex和Outindex处的数进行比较,如果相同,同时往后走。
  3. 如果不相同,则出栈序列去和辅助栈的栈顶的数据比较,如果相同,则pop掉栈顶,++OutIndex,然后继续和栈顶比较,如果相同,只要入栈队列没走完,就将数据放入辅助栈。
  4. 如果入栈序列已经走完了,让出栈序列依次栈顶数据比较,只要不匹配肯定是非法的。
    图示如下:
    这里写图片描述

基于这样的思想,可以写出如下代码:

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

bool CheckStack(vector<int> In, vector<int> Out)
{
    if (In.size() != Out.size())//判断入栈和出栈的个数是否相同
        cout << "Input Error!\n" << endl;

    stack<int> s;
    size_t InIndex = 0;
    size_t OutIndex = 0;
    while (InIndex <= In.size() && OutIndex <= Out.size())
    {
        if (In[InIndex] == Out[OutIndex])//如果入栈等于出栈,继续往后比较
        {
            ++InIndex;
            ++OutIndex;
        }
        else if (!s.empty() && Out[OutIndex] == s.top())//如果入栈和出栈不匹配,出栈序列就去和栈顶比
        {
            while (!s.empty() && Out[OutIndex] == s.top())
            {
                s.pop();
                ++OutIndex;
            }
        }
        else//当前不匹配,入栈的序列继续往后走
        {
            //将不匹配的先入到栈中
            s.push(In[InIndex]);
            ++InIndex;
        }

        if (InIndex >= In.size())//如果入栈序列已经走完,出栈序列和栈顶元素一一比较
        {
            while (!s.empty() && Out[OutIndex] == s.top())
            {
                s.pop();
                ++OutIndex;
            }

            //如果和栈中比较完,两个序列都走完了,即表明顺序合法
            if (InIndex == In.size() && OutIndex == Out.size())
            {
                return true;
            }

            //说明出栈的序列中和栈顶有不匹配的数,即出栈顺序不合法
            else
            {
                return false;
            }
        }
    }
}

int main()
{
#if 0
    vector<int> In = { 1, 2, 3, 4, 5 };
    vector<int> Out = { 5, 4, 3, 2, 1 };
    cout<<CheckStack(In, Out)<<endl;
#endif

#if 1 
    vector<int> In = { 1, 2, 3, 4, 5 };
    vector<int> Out = { 3, 2, 1, 4, 5 };
    cout << CheckStack(In, Out) << endl;
#endif

#if 0
    vector<int> In = { 1, 2, 3, 4, 5 };
    vector<int> Out = { 5, 4, 2, 3, 1 };
    cout << CheckStack(In, Out) << endl;
#endif
    system("pause");
    return 0;
}

如有错误的地方,还望更正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

出栈的合法性检测 的相关文章

  • R语言入门(一)

    R语言入门 一 在vscode中使用R语言注意事项 按照其他教程安装配置插件 使用run source运行r代码 使用run code 会报错 原因未知 生成正态分布的点数据 import pandas as pd import numpy

随机推荐

  • win7+ VS2010安装CUDA7.0图文说明

    win7 VS2010安装CUDA7 0图文说明 1 查看本机配置 查看显卡类型是否支持NVIDIA GPU 选中计算机 gt 右键属性 gt 设备管理器 gt 显示适配器 NVIDIA GeForce GT 610 从https deve
  • Servlet 基础知识(4)(利用Servlet实现文件上传功能)

    目录 1 DiskFileUpload 类 1 setSizeMax 方法 2 setSizeThreshold 方法 3 setRepositoryPath 方法 4 parseRequest HttpServletRequest req
  • TOOLS_Python获取音域范围

    基于librosa pyin方法 链接 获取基频最值 对比标准音高序列 得到音域范围 def create standard pitch sequence 生成一个包含名称的标准音高序列 T C C D D D E E F F G G G
  • 第七届蓝桥杯省赛C++B组 最大比例

    最大比例 X星球的某个大奖赛设了M级奖励 每个级别的奖金是一个正整数 并且 相邻的两个级别间的比例是个固定值 也就是说 所有级别的奖金数构成了一个等比数列 比如 16 24 36 54 其等比值为 3 2 现在 我们随机调查了一些获奖者的奖
  • sublime text3 安装 golangsublime 配置

    1 安装git 因为golang是通过git来管理远程包的 所以我们首先要安装git 下载地址 http www git scm com download git安装比较简单 直接下一步即可 在Windows Explorer integr
  • Spring Boot:如何配置Undertow容器?不会我教你

    环境说明 Windows10 Idea2021 3 2 Jdk1 8 SpringBoot 2 3 1 RELEASE 一 前言 作为springboot开发者 使用最多的就是Tomcat 这是springboot默认的容器技术 而且是内嵌
  • MyEclipse修改.properties文件的编码

    MyEclipse中新建一个messageResource properties文件 如果输入中文保存时就会提示错误 Save could not be completed Reason some characters cannot be
  • 京东零售大佬为你讲解:黑盒测试的底层逻辑

    什么是黑盒测试 它是把程序看作一个黑盒子 在不考虑程序内部结构的情况下 检查程序功能是否按照PRD的规定正常使用 程序是否能适当地接收输入数据 产生正确的输出 这其实就是黑盒测试的定义 也是黑盒测试的底层逻辑 一般人不会重视定义 但往往就是
  • html5 canvas(小树姐的牛掰到爆了的作品)

    自从小树嫁了个牛逼的前端之后 canvas的境界超过我了 小树demo 小编表示 这个境界 这个几何 让我有种跪舔的感觉 http www wow trend com brand index shtml 这个hover让我彻底凌乱了 div
  • react中Hooks

    React Hook Hooks是什么 常见的Hook 1 state Hook 2 Effect Hook 3 Ref Hook 4 Context Hook React Hook Hooks是什么 1 Hook是react 16 8版本
  • Qt的ui文件不能简单复制

    在使用vs Qt开发时 直接复制另外一个widget类的ui文件 简单改名成当前类对应的ui文件 会导致编译出错 尽可能使用添加的Qt class自带的ui文件 因为ui文件的配置文件中有许多与当前类相关的字符串 简单复制容易报错
  • 二叉树的结点数

    二叉树的结点数 10分 已知二叉树的结点结构定义如下 typedef struct NODE char data struct NODE lch rch NODE 说明 data 为数据域 均为英文大写字母 lch 和 rch 分别为指示左
  • 抖音视频怎么去水印

    水印 一般是指放置在图片 视频或者文档上的文字或者图标 用来做标记或者品牌宣传 我们从网上获取的文件资源很多都是带有水印的 比如从抖音短视频下载的视频就会带有水印 为了达到更好的观看效果 我们就需要将这些视频自带的水印给去除掉 下面就来教教
  • Unity Shader渲染顺序 坐标系 和光照模型

    1 Shader中的渲染顺序 是按照Queue Geometry RenderType Opaque Queue是一般渲染时候的顺序 RenderType是后处理特效使用的渲染顺序 Background Geometry AlphaTest
  • JAVA中XML格式字符串转为javabean(对象),然后返回xml格式字符串

    一 引入相关依赖 pom xml文件配置如下所示
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • CH3___Debugging C++ Programs

    3 1 Syntax and semantic errors Modern compilers have been getting better at detecting certain types of common semantic e
  • Linux下yum命令及软件的安装

    yum命令 1 yum install softwarename 安装 2 yum remove softwarename 卸载 安装dhcp及卸载 mkdir iso 建立目录 mv home kiosk Desktop iso iso
  • tcp 是一个安全的网络协议

    1 tcp 是一个安全的网络协议 确定双方的收发能力之后 才会真正传输数据 2 tcp 建立起一个连接 比较消耗成本 所以比较平稳 安全 3 3次握手 发起连接 双方确认 确认双方的收发能力 客户端告诉服务器i我要创建连接i 一次 服务器告
  • 出栈的合法性检测

    对于一个给定的入栈顺序 可能的出栈顺序会有很多 但是肯定都要遵循栈 后进先出 的特点 那么怎么进行合法性检测呢 算法思想如下 定义变量InIndex标记入栈序列的当前位置 定义OutIndex标记出栈序列的当前位置 对InIndex和Out