题目:

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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. 【ZJOI2017】仙人掌

    [ZJOI2017]仙人掌 参考博客:https://www.cnblogs.com/wfj2048/p/6636028.html 我们先求出\(dfs\)树(就是\(dfs\)一遍),然后问题就变成 ...

  2. CF917D Stranger Trees

    CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...

  3. php面试题整理(一)

    str_split() print_r(str_split("Shanghai"));Array ( [0] => S [1] => h [2] => a [3] ...

  4. PHP程序员的能力水平层次

    PHP程序员的能力水平层次 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开 ...

  5. vue快速入门

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  6. 使用VMWare虚拟mac系统,设置网络的正确姿势

    1. 启动mac虚拟机: 2. 虚拟机-虚拟机设置-网络适配器-选择NAT模式: 3. 打开mac的网络设置,选择使用DHCP模式,并设置DNS服务器为win的DNS: 4. 回到win,控制面板-网 ...

  7. vue.js 二维码生成组件

    安装 通过NPM安装 npm install vue-qart --save 插件应用 将vue-qart引入你的应用 import VueQArt from 'vue-qart' new Vue({ ...

  8. ESP32入门示例 - SD卡Web服务器

    这个是来自ESP32官方示例的改版,官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题,所以进行了一些修改 主要修改有:1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录 ...

  9. DVR登录绕过漏洞(CVE-2018-9995)

    ###漏洞描述 此漏洞允许攻击者通过修改“Cookie: uid=admin” 之后访问特定 DVR 的控制面板,返回此设备的明文管理员凭证. ###漏洞利用 1.利用代码 curl "ht ...

  10. OpenCV3编程入门笔记(一)

    ---恢复内容开始--- 图像处理技术一般包括图像压缩,增强和复原,匹配.描述和识别3个部分.图像处理和计算机视觉的区别在于:图像处理侧重于“处理”图像——如增强.还原.去噪.分割等:而计算机视觉重点 ...