剑指Offer(二十一):栈的压入、弹出序列

搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法、机器学习干货

csdn:https://blog.csdn.net/baidu_31657889/

github:https://github.com/aimi-cn/AILearners

一、引子

这个系列是我在牛客网上刷《剑指Offer》的刷题笔记,旨在提升下自己的算法能力。

查看完整的剑指Offer算法题解析请点击:剑指Offer完整习题解析

二、题目

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

1、思路

做这个题之前,首先我们要清楚进栈出栈变化形式是什么,值的注意的是: 并不是最新进栈的元素只能最后处栈。举例子来说,我们现在有三个整型数字元素1,2,3依次进栈,会有哪些出栈次序那?

次序会有以下5种:

  • 1、2、2进,再3、2、1出,出栈次序为321;
  • 1进,1出,2进,2出,3进,3出,出栈次序为123;
  • 1进,2进,2出,1出,3进,3出,出栈次序为213;
  • 1进,1出,2进,3进,3出,2出,出栈次序为132;
  • 1进,2进,2出,3进,3出,1出,出栈次序为231。

然后就是我们的算法了,借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

上面的解释如果还不很懂的话,我参照了一个大佬的动态图解和详细步骤解释的方法放下面:

博客地址:https://blog.csdn.net/fanfan199312/article/details/91346039

1.入栈顺序 1,2,3,4,5。

出栈顺序,4,5,3,2,1

解题过程,我们需要用一个辅助栈,按照出栈顺序把入栈数值压入弹出一遍,对比弹出顺序是否与出栈相等

(1)出栈元素4,那么4之前所有的入栈元素1,2,3,4都已经入辅助栈。(1,2,3不先入栈,4怎么入栈,也没法出栈了),辅助栈结果,1,2,3,4。对比辅助栈4和出栈元素4相等弹出。

入栈顺序 1,2,3,4,5。

出栈顺序 4,5,3,2,1

辅助栈元素,1,2,3,4 弹出栈顶元素4

(2)出栈元素5,辅助栈中栈顶元素不是5,所以从入栈序列中把5之前的元素都入栈,直到遇到5

入栈顺序 1,2,3,4,5

出栈顺序 4,5,3,2,1

辅助栈,1,2,3,5,弹出对应栈顶元素5

(3)出栈顺序3 与辅助栈顶元素3,对比相等,弹出栈顶元素3.

入栈顺序 1,2,3,4,5。

出栈顺序 4,5,3,2,1

辅助栈1,2,3 弹出栈顶元素3

(4)出栈顺序2与辅助栈顶元素2,对比相等,弹出栈顶元素2.

入栈顺序 1,2,3,4,5。

出栈顺序 4,5,3,2,1

辅助栈 1,2,弹出栈顶元素2

(5)出栈顺序1与辅助栈顶元素1,对比相等,弹出栈顶元素1,

入栈顺序 1,2,3,4,5。

出栈顺序 4,5,3,2,1

辅助栈空 1。弹出栈顶元素1。

此时出栈顺序,入栈顺序都已经遍历完成,栈为空,返回。

动图如下

左边辅助栈与右边出栈顺序对比

2、编程实现

python2.7

代码实现方案:

# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
if len(popV) == 0 or len(pushV) != len(popV):
return False
stackData = []
for i in pushV:
stackData.append(i)
while len(stackData) and stackData[-1] == popV[0]:
stackData.pop()
popV.pop(0)
if len(stackData):
return False
return True

AIMI-CN AI学习交流群【1015286623】 获取更多AI资料

分享技术,乐享生活:我们的公众号计算机视觉这件小事每周推送“AI”系列资讯类文章,欢迎您的关注!

剑指Offer(二十一):栈的压入、弹出序列的更多相关文章

  1. 剑指offer-面试题22.栈的压入,弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...

  2. 【剑指offer】栈的压入弹出序列,C++实现(举例)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...

  3. 剑指offer - 栈的压入弹出序列 - JavaScript

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...

  4. 剑指Offer20 栈的压入弹出序列是否正确

    /************************************************************************* > File Name: 20_IsPopO ...

  5. 剑指 offer set 10 栈的压入、弹出序列

    总结 1. 通过按位对比来判断, 没有更优的方法了

  6. 剑指offer二十一之栈的压入、弹出序列

    一.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  7. 剑指offer-栈的压入弹出序列21

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  8. 剑指offer 栈的压入弹出 顺序

    判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍 ...

  9. 剑指offer-面试题31-栈的压入弹出序列-栈

    #include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...

  10. 剑指offer四十一之和为S的连续正数序列

    一.题目   题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数 ...

随机推荐

  1. xpath路径的写法

    关于xpath路径的写法 1.选取节点 表达式 描述 nodename 选取此节点的所有子节点. / 从根节点选取. // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置. . 选取当前节点 ...

  2. linux作业控制和文件系统

    一.作业控制 [root@tianyun ~]# sleep 2000运行一个程序,当前终端无法输入. 1  直接运行后台程序.暂停一个前台程序.[root@tianyun ~]# sleep 300 ...

  3. 为 Editor.md 编辑器插件增加预览和发布按钮

    前言 一直在使用 Editor.md 插件作为博客的编辑器,用着挺好,但是在全屏下编辑时,每次想预览或者保存又必须切换到非全屏状态下才可以点击按钮,用着不舒服,所以花了一点时间在工具栏上增加了预览.保 ...

  4. HPU暑期集训积分赛2

    A. 再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z ...

  5. Model设计中常见的技巧和注意事项

    verbose_name 可以作为第一个参数传入,书写更加工整和有序: name = models.CharField('类别名',default="", max_length=3 ...

  6. 8天入门docker系列 —— 第八天 让程序跑在swarm集群上

    真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的, 所以部署起来还是非常简单的. 一:前置 ...

  7. kubeadm源码分析

    k8s离线安装包 三步安装,简单到难以置信 kubeadm源码分析 说句实在话,kubeadm的代码写的真心一般,质量不是很高. 几个关键点来先说一下kubeadm干的几个核心的事: kubeadm ...

  8. curl工具使用实例

    curl是一个命令行工具,其基于libcurl库,用于发送网络请求,获取并展示响应数据,下面来看curl的具体用法. 1.下载网页源码 curl命令直接接URL,用于下载指定URL的网页源码,并将其显 ...

  9. python中下标和切片的使用

    下标 所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间. Python中字符串,列表,元祖均支持下标索引. 例如: # 如果想取出部分字符,可使用下标 name=&quo ...

  10. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...