题目:

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

思路:

  添加一个辅助栈

  我们将用上面一个指针,pNextPush,进行移动,每移动一次将里面的数压栈,直到栈顶与下面一个指针指向的数相同时停下,

(至于为什么pNextPush跑到5,详情见代码)

  接下来我们弹栈,把下面一个指针pNextPop向前移动,发现不相等,那么我们就执行上面一步

以此类推,最后当我们得到pNextPop走到最后,而且栈为空时,我们就可以得出题设成立,接下来贴出一段书中不成立的例子,就不具体分析了

  

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean bPossible = false;
if(pushA.length==0&&popA.length==0)
return bPossible; int pNextPush = 0;
int pNextPop = 0;
Stack stack = new Stack(); while(pNextPop<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
} if((int)stack.peek()!=popA[pNextPop])
break;
if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
System.out.println(out);
pNextPop++;
} }
if(stack.isEmpty()&&pNextPop==popA.length){
bPossible = true;
} return bPossible;
}
}

  这道题的判断条件非常值得推敲,第一个while:

   while(pNextPop<pushA.length)如果这里把它改成pNextPush<Length,那么我们的循环将会提前结束,也就是如下图情况

  接下来还有中间的判断

    public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean bPossible = false;
if(pushA.length==0&&popA.length==0)
return bPossible; int pNextPush = 0;
int pNextPop = 0;
Stack stack = new Stack(); while(pNextPop<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
}
if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
pNextPop++;
}
/*这是我第一版的代码
这里这么写主要是为了防止死循环,重新进入循环内第一个while
然而这也导致了卡在了上图的时候,就直接跳出循环*/ if(pNextPush==pushA.length)
break; }
if(stack.isEmpty()&&pNextPop==popA.length){
bPossible = true;
} return bPossible;
}

  

 while(pNextPush<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
} if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
System.out.println(out);
pNextPop++;
}
/*这是第二版的循环体,显然不科学,当4弹出时,5还未进栈,条件成立,直接退出*/
if((int)stack.peek()!=popA[pNextPop])
break; }

  

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

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

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

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

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

  3. 剑指Offer:栈的压入、弹出序列【31】

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

  4. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

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

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

  6. 【剑指Offer】栈的压入、弹出队列 解题报告(Python)

    [剑指Offer]栈的压入.弹出队列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  7. 剑指offer(13)-栈的压入、弹出序列 九度1366

    题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...

  8. Go语言实现:【剑指offer】栈的压入、弹出序列

    该题目来源于牛客网<剑指offer>专题. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5 ...

  9. 剑指OFFER之栈的压入、弹出序列(九度OJ1366)

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

随机推荐

  1. day 07 字符编码

    一:字符编码 1.字符编码 什么是字符编码:将人能识别的字符转换为计算机能识别的01二进制的过程就是字符编码,转换的规则就是字符编码表 常用的编码表:ASCII.GBK.Unicode.UTF-8 了 ...

  2. OpenCV遍历彩色图像、灰度图像的像素值方法

    https://blog.csdn.net/mooneve/article/details/53001677 应用:将彩色图像转为灰度图像输出 方法一 使用ptr函数和指针 (高效) void mai ...

  3. RabbitMQ学习系列

    http://www.cnblogs.com/zhangweizhong/category/855479.html https://www.cnblogs.com/zhangweizhong/p/56 ...

  4. tomcat (选号)公司tomcat无页面解决

    问:我现在的有的解决方法就是把上一次war包下下载下来,在重启tomcat 答:那不行,更新war包就没有意义了,你都没排查故障  就直接说war包少东西?主页都没有..还能少主页也不是404.war ...

  5. springboot 创建非web项目及数据源简单使用

    项目组马上要使用springboot来重构程序,首先要对几个比较小的非web项目重构,所以新手入门,简单做了个小例子 代码结构如下: dao层 package com.mysping.myboot00 ...

  6. log4net配置文件

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  7. Java验证工具类

    在项目中使用Java经常有验证功能的使用,比如手机号,密码等验证. 总结一下,写出个工具类方便以后用的时候直接引. package com.common.utils; import org.apach ...

  8. Eclipse中快速打开文件所在的文件夹位置

    本篇文章是紧接着Elicpse使用技巧-打开选中文件文件夹或者包的当前目录文章写的,本文主要是讲的利用eclipse插件的方式打开文件夹的位置, 由于eclipse版本的区别,所以插件也分成两种(实测 ...

  9. [Spark][Python][Application]非交互式运行Spark Application 的例子

    非交互式运行Spark Application 的例子 $ cat Count.py import sys from pyspark import SparkContext if __name__ = ...

  10. [翻译] ASP.NET Core 2.1.0 发布

    原文: ASP.NET Core 2.1.0 now available 今天,我们很高兴可以发布 ASP.NET Core 2.1.0!这是我们 .NET平台下开源的.跨平台的 Web 框架的最新版 ...