题目:

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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. CSAPP:第八章 异常控制流1

    CSAPP:第八章 异常控制流1 关键点:异常 8.1 异常8.2 进程   现代系统通过使控制流发生突变来对这些情况做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Cont ...

  2. 1-tomcat简介

    一.tomcate的目录结构说明: 1.bin:存放服务器启动和关闭的命令文件.2.conf:存放服务器的配置信息文件3.lib:存放服务器自身需要的所有jar文件,也称为全局jar文件(只要部署在当 ...

  3. spring 、spring boot 常用注解

    @Profile 1.用户配置文件注解. 2.使用范围: @Configration 和 @Component 注解的类及其方法, 其中包括继承了 @Component 的注解: @Service. ...

  4. WiFi-ESP8266入门http(1)-建立服务器,直接发送网

    #include <ESP8266WiFi.h> /*** 该工程可以在2.4.0版本esp8266库中运行,没在更高版本库中进行测试 ***/ const char *ssid = &q ...

  5. pip 安装指定版本软件包

    默认情况下,pip 将安装最新版本的软件包,但有时需要获取特定版本的安装包,比如 jinja2 从 2.9 开始加入了 async 关键字,这个会导致 py2exe 报错:Invalid Syntax ...

  6. wxWidgets 在 Linux 下开发环境配置

    本文基于 CodeBlocks (16.0.1) 和 wxWidgets (3.0.2) 搭建 Linux 下 GUI 开发环境. 1. 安装 CodeBlocks Ubuntu 默认的源当前 Cod ...

  7. 20175310 MyCP(课下作业,必做)

    一.作业要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内 ...

  8. sk_buff Structure

    The structure has changed many times in the history of the kernel,both to add new options and to reo ...

  9. linux内存源码分析 - 内存回收(整体流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文 ...

  10. bat性能效率受啥影响

    代码效率的提升往往由算法决定,曾发过专贴(浅谈提高代码效率的编写习惯:http://tieba.baidu.com/p/1187281687),但是以实例为主,并没有太多的文字说明,现在归纳一下:影响 ...