题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个栈是否为该栈的弹出顺序。假设压入栈的所有数字都不相等。例如序列1,2,3,4,5是某个栈的压入顺序,序列4,5,3,2,1是该栈序列的一个弹出序列,但是4,3,5,1,2就不是其弹出序列。(两序列长度相同)

思路:主要是栈的压入和弹出序列

借用大神链接:

https://www.cnblogs.com/edisonchou/p/4779755.html

为此我们加入一个辅助栈,在将压入顺序矩阵依次压入辅助栈的同时,判断其栈顶元素是否是弹出序列的栈顶元素,若是,则将辅助栈的栈顶元素弹出,并将弹出序列的待判断数向后移一位。若辅助矩阵不为空,则继续判断辅助矩阵栈顶元素是否和弹出序列的待判断数相同,若相同,则继续弹出辅助矩阵,若不相同,则将压入序列继续压入辅助矩阵。

当弹出序列被遍历完成,且辅助矩阵为空,则匹配成功。

 import java.util.ArrayList;
import java.util.Stack;
//首先判断是否为空,若为空则返回错误
//采用辅助栈的方法来对栈进行操作
//将push中的元素依次压入辅助栈中,压入一个则将其与pop中的元素进行比较,如相等,则将辅助栈中该元素弹出
//之后再将pop中需要判断的元素向后推一个,并与辅助栈中元素对比,相等则继续弹出,不相等,则将push中元素继续压入辅助栈,并进行对比
//直到pop栈中元素遍历结束,若此时辅助栈不为空,则返回false,否则返回true
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length ==0||popA.length == 0)
return false;
Stack<Integer> s = new Stack<Integer>();
int popIndex = 0;//用于标识弹出序列的位置
for(int i = 0;i<popA.length;i++){
s.push(pushA[i]);
//如果栈顶元素不为空,且其和弹出序列相同
while(!s.empty() &&s.peek() == popA[popIndex]){
s.pop();
popIndex++;
}
}
return(s.empty());
}
}

在对上述程序进行验证的过程中,我发现当pushA的大小大于popA时,也会输出true,这说明题目中假定两个序列长度相同,就代表我们不需要对序列长度再次进行判断。

     public static void main(String [] args) {
Solution1 x = new Solution1();
int [] pushA = {1,2,3,4,5,6};
int [] popA = {4,5,3,2,1};
System.out.println(x.IsPopOrder(pushA,popA));
}

此时依旧返回True.开心,自己看出并验证出的小发现。

剑指offer——栈的压入、弹出序列的更多相关文章

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

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

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

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

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

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

  4. 剑指Offer 栈的压入、弹出序列

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

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

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

  6. 剑指offer 栈的压入和弹出

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

  7. 用js刷剑指offer(栈的压入、弹出序列)

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

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

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

  9. 剑指offer--28.栈的压入、弹出序列

    时间限制:1秒 空间限制:32768K 热度指数:300132 本题知识点: 栈 算法知识视频讲解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假 ...

随机推荐

  1. Reac全家桶笔记

    函数作为无状态组件的使用: const EllipsisTdContent = ({ text, width }) => { return ( <div className="t ...

  2. saltstack总结-2018-0620

    以下结论 结论1由于minion配置文件里能配置的只有master的IP和master的ret_port,而无法指定master的publish_port因此minion获取的master的publi ...

  3. defer、return、返回值,这三者的执行逻辑

    defer.return.返回值,这三者的执行逻辑是: return 最先执行,return 负责将结果写入返回值中:接着defer执行,可能修改返回值:最后函数携带当前返回值退出.

  4. SRE_ Google运维解密

    # 第IV部分 管理 #系统可用性时间表 # 专用术语 SLO:服务等级目标 LCE(Land-Covered Earth):紧急检修登陆艇 # 紧急事故管理 一次流程管理良好的事故 # 东西早晚要坏 ...

  5. 提示-bash: telnet: command not found的解决方法

    Linux centos 运行telnet命令,出现下面的错误提示: [root@localhost ~]# telnet 127.0.0.1 9501 -bash: telnet: command ...

  6. Linux系统下安装Angular2开发环境(Ubuntu16.0和deepin)

    说明下,以下过程都是在ubuntu16.0系统下,win系统环境下的安装过程更简单,基本上可以仿效此环境来,除了不用配置系统命令(win下自动可以),node安装是exe程序,一键安装.另外,这里面像 ...

  7. 分词工具Hanlp基于感知机的中文分词框架

     结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词.词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用1个算法解决3个问题,时自治同意的系统,同时三个任务顺序渐进,构 ...

  8. [ZZ] NumPy 处理数据

    NumPy-快速处理数据--ndarray对象--数组的创建和存取 https://www.cnblogs.com/moon1992/p/4946114.html NumPy-快速处理数据--ndar ...

  9. node.js 远程调试debug产线环境代码

    一.背景: 产线机器出bug,不能重启服务,需要保留现场,问题不好排查,只能靠远程debug. 二.实现步骤 1. 登录远程机器执行如下命令,nodePid为node服务的pid kill -usr1 ...

  10. 工控随笔_10_西门子_WinCC的VBS脚本_01_基础入门

    很多人都认为VB语言或者VBS脚本语言是一种很low的语言,从心里看不起VB或者VBS, 但是其实VBS不仅可以做为系统管理员的利器,同样在工控领域VBS语言大有用武之地. 西门子的WinCC提供了两 ...