判断一个数列是否是栈的输出序列

给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。(HW.3.2) 给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。(HW.3.2) 1.问题描述 【问题描述】给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,则为有效输出,返回总的出栈次数,如果不能,则为无效输出,返回0。序列的输入及输出都是从左往右。 1、输入输出序列皆为正整数,可能有重复的数字 2、如果一个数字在输入序列中没有出现,但在输出序列中出现,则为无效输出。 3、如果... 阅读详情

1题目内容

1.1 问题描述

给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,返回总的出栈次数,如果不能,返回0。序列的输入及输出都是从左往右。(输入输出序列皆为整数且没有重复的数字,如果一个数字在输入序列中没有出现,那么其在输出序列中也不会出现)

1.2 输入形式

第一行为输入序列的长度,然后为输入序列的数字;第二行为输出序列的数字。输入数据以空格隔开。

1.3 输出形式

如果是一个出栈序列,则返回总的出栈次数, 否则返回0

1.4 样例输入

5 1 2 3 4 5
1 2 3 4 5

1.5 样例输出

5

1.6 样例说明

第一行输入的第一个数字是序列的长度,1 2 3 4 5 输入序列,以空格隔开,输出的总的出栈次数。

2 大致思路

这道题有很多需要注意的地方

首先是读取第二行的输入数据。因为没有给出第二行要有多少输入数据,所以需要写个EOF。

对于解题思路而言,思考几个例子:

5 1 2 3 4 5
4 5 3 2 1
(输出5,1 2 3入栈, 4入栈,4出栈,5入栈,5出栈,3 2 1出栈)
5 1 2 3 4 5
5 1 
(输出5, 1 2 3 4 5入栈,5 4 3 2 1出栈,但只取5和1)
5 1 2 3 4 5
4 5 3 1 2
(输出0, 因为1不能在2之前出栈)

第三个例子不能作为输出序列,是因为1出栈前需要2也出栈,但目标序列需要2在1后出栈。(后面还有好多思路,但是我不会讲233)

3 实现代码

#include<stdio.h> 
int stack[100+5];
int aimStack[100+5];
int record[100+5];

int find_aim(int a[], int a_length, int aim)
{
    int i = 0;
    for(i = 0; i < a_length; i++)
    {
        if(a[i] == aim) return i;
    }
    return -1;
}

int main(void)
{
    int flag = 0;
    // input
    int n; // stack length
    scanf("%d", &n);
    int i = 0;
    for(i = 0; i < n; i++)
    {
        scanf("%d", &stack[i]);
    }
    int m = 0; // aim stack length
    while(scanf("%d", &aimStack[m]) != EOF){
        m++;
    }
    // input data end

    for(i = 0; i < n ; i++)
    {
        record[i] = 1;
    }
    int formerOneIndex = find_aim(stack, n, aimStack[0]);
    int currentOneIndex;
    record[formerOneIndex] = 0;
    for(i = 1; i < m; i++)
    {
        currentOneIndex = find_aim(stack, n, aimStack[i]);
        if(record[currentOneIndex] == 0)
        {
            flag = 1;
            break;
        }
        if(currentOneIndex > formerOneIndex)
        {
            record[currentOneIndex] = 0;
            formerOneIndex = currentOneIndex;
        }
        else if(currentOneIndex < formerOneIndex)
        {
            int j = 0;
            for(j = currentOneIndex; j < formerOneIndex; j++)
            {
                record[j] = 0;
            }
        }
    }
    if(flag == 1)
    {
        printf("0\n");
    }
    else
    {
        int num = 0;
        for(i = 0; i < n; i++)
        {
            if(record[i] == 0) num++;
        }
        printf("%d\n", num);
    }
    return 0;
}

4 学习后言

在这里插入图片描述
这和栈也没太大关系。

lubuntu(18.04) 安装中文输入法,安装 googlepinyin 我爱 lubuntu 胜过爱维C 一 安装 fcitx(fcitx是输入法框架,ubuntu自带) sudo apt-get install fcitx sudo apt-get install fcitx-googlepinyin sudo apt-get install fcitx-config-gtk fcitx-frontend-all fcitx-frontend-gtk3 fcitx-ui-classic sudo apt-get install -f 二 配置环境变量 vi ~/.bashr 阅读详情

相关推荐

Lubuntu 20.04 下 Fcitx 输入法的安装与优化配置指南

本文详细介绍了在Lubuntu 20.04系统上安装和优化Fcitx输入法的完整指南。从系统准备、核心安装到环境变量配置和常见问题解决,帮助用户轻松实现高效中文输入体验。特别适合轻量级Linux用户提升输入效率,涵盖Google拼音、搜狗输入法等多种引擎的安装与配置技巧。

weixin_29291069的博客 617

python的输入输出格式

1、输入一个整数 a = int(input()) 2、输入一行整数 a = list(map(int, input().split()) 3、输入一个字符串,转换成字符数组 line = input() line = [i for i in line.split()]

qq_46580042的博客 830

判断一个数列是否是栈的有效输出序列

【问题描述】给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,则为有效输出,返回总的出栈次数,如果不能,则为无效输出,返回0。序列的输入及输出都是从左往右。 1、输入输出序列皆为正整数,可能有重复的数字 2、如果一个数字在输入序列中没有出现,但在输出序列中出现,则为无效输出。 3、如果一个数字在输入序列中出现,但在输出序列中没有出现,只要输出可以通过对输入数字进行出栈操作获取,...

echo_xiao9的博客 4165

lubuntu输入法设置_ubuntu的环境以及输入法设置

0、删除sogou输入法(1)删除用户目录~/.config文件夹内三个以Sogou开头的文件夹,这是搜狗输入法的配置文件夹(2)彻底卸载fcitxsudo apt remove fcitx一、配置源我的输入法不显示, 系统设置的语言支持也打不开,fcitx报错。试了清华源不好用,还是有错(也可能是后续操作有问题),反正后来用阿里源成功了。(1) 修改 /etc/apt/sources.lis...

weixin_42540248的博客 938

判断一段数列是不是从栈里面输出的

问题描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路分析: 把输入串和输出串从头开始相比较,判断栈是否为空,如果不为空,判断输

cherry_chenrui的博客 1255

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

判断一个序列是否为栈的有效输出序列

栈的实际应用—判断一个序列是否为栈的有效输出序列 对于数据结构学科的初学者,栈的构建是很重要的知识,判断一个栈是否为有效输出序列是其中重要的题目。笔者整理了三种C++代码,其核心编程思想大致相同,希望能对初学者有一定帮助。 **【问题描述】**给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,则为有效输出,返回总的出栈次数,如果不能,则为无效输出,返回0。序列的输入及输出都是从...

weixin_45654046的博客 5100

在Matlab中开发AutoSAR模型的流程(自下而上)

前面介绍了AutoSAR软件组件开发的两种方式,其中自下向上的方式,是从模型出发,流程如下。

小胡同学的工程师学习之路 5366

判断一个序列是否是栈的弹出序列

给定两个序列,判断后一个序列是否是 第一个序列入栈的出栈顺序 学习过在数据结构的人肯定遇到过很多这种题目 比如给定一个序列 如 1 2 3 4 5的入栈序列 问 4 5 3 2 1是不是前者的一个出栈序列 思路 首先看 出栈序列 4 5 3 2 1 第一个元素是4 也就是说入栈时 必须要先找到4 然后出栈在继续找 5 ,可以

小鱼的专栏 1491

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4319

手把手教你用Github提交CVE漏洞(附完整截图流程)

本文提供了在GitHub平台提交CVE漏洞的完整实战指南。从前期准备、目标搜寻与漏洞验证,到撰写规范的GitHub Issue进行披露,最后通过官方渠道完成CVE提交,手把手教你如何将安全研究成果转化为获得国际认可的CVE编号。

weixin_28309571的博客 326

【面试题】判断一个序列是不是栈的输出序列

题目描述:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5、6、7,那么2、1、4、3、7、6、5就有可能是一个pop系列。但序列4、3、5、1、2、7、6就不可能是push序列1、2、3、4、5的pop序列。 问题分析:解决这个问题我们可以申请

过往记忆大数据 4万+

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1668

判断一个序列是不是栈的输出序列

题目描述:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5、6、7,那么2、1、4、3、7、5、6就有可能是一个pop系列。但序列4、3、5、1、2、7、6就不可能是push序列1、2、3、4、5的pop序列。 问题分析:解决这个问题我们可以申请

3890

LabView实现modbus通讯

labview实现modbus通讯

Lrj的博客 7663

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6276

【无标题】判断是否能按规定顺序出栈

给出一个由1到n组成的无序数列,如果我们把这个序列看成是数字1~n出栈的顺序,并且入栈顺序是1, 2, 3, ..., n,请问操作时,栈内最多能有多少个元素? 看这个题,因为这些数的入栈顺序一定是1~n,所以你要取出某个数,就得把比它小的数一次放进去,并且你放入的数一定要比去除的数大,否则无法完成入栈和出栈. 首先,将和第一数相等以及小于它的数依次入栈,判断入栈个数,记录下来,用max标记。然后将该数取出,再判断接下来的数是否和栈中后面的数相等,相等就输出,不相等就再放入比这数小的数字,再记录个数,和

m0_62797635的博客 352

【RT-DETR有效改进】轻量级网络ShuffleNetV2(附代码+修改教程)

从今天开始正式开始更新RT-DETR剑指论文专栏,本专栏的内容会迅速铺开,在短期呢大量更新,价格也会乘阶梯性上涨,所以想要和我一起学习RT-DETR改进,可以在前期直接关注,本文专栏旨在打造全网最好的RT-DETR专栏为想要发论文的家进行服务。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR​​。

Snu77的博客 1994

快速判断一个数列是否是合法的出栈顺序

背景 做笔试题目的时候,发现有一些试卷有给定一个进栈序列让你判断下列哪个是合法/不合法的出栈序列。 通常进栈的序列不是升序如{1,2,3,4,5,6}就是{6,5,4,3,2,1},当然其他的我好像就没有看到了,如果遇到了其他的情况会及时更新在这篇博客中的。 快速判断方法 Problem 1:有六个元素{6,5,4,3,2,1},按照该顺序入栈,那么以下哪一个是不合法的出栈顺序(). A) 543612 B) 453126 C) 346521 D) 234156 发现入栈的顺序是降序排列,由于栈是FIL

余得水的个人博 7246

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

判断给定序列是否是对应入栈序列的出栈序列(C++)

题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 (假设压入栈的所有数字均不相等) 如 序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2不可能是该压栈序列的弹出序列。 思路: 使用一个辅助栈,依次将压栈序列的元素入栈,同时判断出栈序列的元素与栈顶元素是否相等。 全部压栈

decode 2545

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【java】合法括号序列判断与Fibonacci数列

因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。Fibonacci数列是这样定义的:F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2]

m0_72161237的博客 703

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

判断给定整数序列能否构成等差数列

Problems A.请写一个程序,判断给定整数序列能否构成等差数列 输入说明:多组数据,每组输入数据由两行构成,第一行只有一个整数n(<1000), 表示序列长度(即序列中整数的个数,0表示输入结束),第二行为n个整数, 每个整数的取值区间都为[-32768----32767] -> (int),整数之间以空格或挑格间隔。 输出说明:对于每一组数据,输出一个yes或no,表示该序列能...

yingmu__的博客 3087
上一篇: 判断一个序列是否为合法序列
下一篇: 二元查找树的后序遍历
胖琦今天也在摸鱼
博客等级 码龄9年 11粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值