1.题目描述

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

2.思路

首先要理解为什么栈的压入顺序一定的情况下却可以有不同的弹出顺序,就是在栈的压入过程中可以向外弹元素,不一定是全部元素进栈才开始向外弹栈,所以会产生不同的弹栈顺序。

1.题目给的是ArrayList,使用这个作为辅助空间

然后就是借助一个辅助空间,将压栈的序列储存起来,储存过程中判断是否和弹栈序列一致,如果一致就让弹栈序列指向后一位,等压栈序列全部进辅助空间后,在开始反向遍历一次,因为题目说明没有重复元素,所以进辅助空间过程中判断过的元素可以重复判断,不会出错,遍历过程中判断是否和弹栈序列元素相等,相等就弹栈序列指向后一位,并且辅助空间也指向下一个元素,不相等就只让辅助空间指向下一个元素,这样反向遍历完辅助空间后如果弹栈序列没有走到最后,就说明不是正确的弹栈序列,如果走到了最后就是正确序列。

import java.util.ArrayList;

public class Solution {

public boolean IsPopOrder(int [] pushA,int [] popA) {

if(pushA.length == 0 || popA.length == 0)

return false;

int i = 0; //指向压栈序列的指针

int j = 0; //指向弹栈序列的指针

ArrayList helpList = new ArrayList<>(); //储存压栈序列的辅助空间

while(i < pushA.length){ //第一次遍历把压栈序列放入辅助空间中

helpList.add(pushA[i]);

if(helpList.get(i) == popA[j]){ //如果有相等的就让弹栈序列指针++。

j++;

}

i++;

}

i = i-1; //这里是细节,最后i=pushA.length所以要-1.

while(i>= 0 && j < popA.length){ //i>=0也是细节,如果只是大于0,0位置的元素就没办法判断了。

if(helpList.get(i)== popA[j]){

i--;

j++;

}else{

i--;

}

}

return j == popA.length ? true:false; //根据弹栈序列的指针是否走到最后判断是不是弹栈序列。

}

}

2: 使用Stack

使用栈结构的好处就是可以省去上面方法过程中的重复判断,因为可以判断到一个相等就直接弹出。

import java.util.Stack;

public class Solution {

public boolean IsPopOrder(int [] pushA,int [] popA) {

if(pushA.length == 0 || popA.length == 0)

return false;

Stack temp = new Stack<>();

int popIndex = 0;

for(int i = 0 ; i < pushA.length; i++){

temp.push(pushA[i]);

while(!temp.isEmpty() && temp.peek() == popA[popIndex]){

temp.pop();

popIndex++;

}

}

return temp.isEmpty();

}

}

方法2参考:Alias

java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)相关推荐

  1. 链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表

    从尾到头打印链表 信息卡片 时间:2020-03-23 题目:从尾到头打印链表 tag:list 题目描述 输入一个链表,按链表从尾到头的顺序返回一个 ArrayList. 01 调用 reverse ...

  2. python 二维数组长度_剑指offer二维数组中的查找【Java+Python】

    点击上方"蓝字",关注了解更多 二维数组中的查找 1. 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序 ...

  3. java listnode 合并链表_剑指offer:合并两个排序的链表(Java)

    1.问题描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 2.思路 方法1:非递归方法 根据题目这个很类似排序中的外排过程,两个数组分别排好序,然后再 ...

  4. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  5. 字符串全排列算法_C#版_剑指OFFER

    字符串全排列算法_C#版_剑指OFFER 题目描述 ​题目描述 输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组. 例如输入字符串ABC,则输出由字符A, ...

  6. 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java

    <LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...

  7. 《LeetCode力扣练习》剑指 Offer 15. 二进制中1的个数 Java

    <LeetCode力扣练习>剑指 Offer 15. 二进制中1的个数 Java 一.资源 题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ...

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

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

  9. abap判断包含字符当中包含小数点_剑指Offer整理3 -- 栈和队列 + 数学和字符串

    专题3 栈和队列 + 数学和字符串 专题3-1 栈和队列 1. 栈的压入弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字 ...

最新文章

  1. mysql临时表是什么意思_来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的...
  2. Excel随机选取指定数据
  3. sql 取汉字首字母
  4. 技术的想象力:云栖大会第一天发布了什么?
  5. python画圆并填充图形颜色_如何使用python设计语言graphics绘制圆形图形
  6. pycharm(windows)安装及其设置中文菜单
  7. xp系统设置锁定计算机,教你XP电脑中有效的设置自动锁屏的方法
  8. 压缩包安装_SPSS 21 下载(内附压缩包及安装过程)
  9. 192.168.8.1手机登陆_192.168.1.1手机登陆
  10. FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)
  11. 美团23届秋招全面启动!5000+机会,60+岗位,3次笔试机会!
  12. 外国小伙发现乌云是黑色的……
  13. 科研日志--python大文件打开内存溢出
  14. 机器学习中:autopct = '%0.3f%%',代表的意思。
  15. nrf51822代码流程(从main展开)
  16. 四川省中小学计算机免试,四川省教育厅关于转发教育部关于进一步做好小学升入初中免试就近入学工作的实施意见的通知...
  17. JAVA面试题整理2020
  18. nginx禁止外网访问
  19. html (第四本书第五章参考)
  20. 用百度 Doodle 记录的2018

热门文章

  1. python怎么读取xls文件_python 怎样读取xls文件内容
  2. 用软件测试管理效率,软件测试攻略(一):效率工具分享
  3. kafka时间轮linux时间轮,Kafka解惑之时间轮 (TimingWheel)
  4. android弹窗自动消失,Android点击popupwindow以外区域 popupwindow自动消失(转载)
  5. list容器java_【Java容器】List容器使用方法及源码分析
  6. C++ 简单的语音合成(TTS,即文字转语音)类
  7. Android开发之购物车加减按钮(附加源码)
  8. Android开发之git提交代码到GitHub仓库教程
  9. IP5的接口模式运行测试
  10. (一)Builder(建造者)模式