剑指offer(16)栈的压入、弹出序列
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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)栈的压入、弹出序列的更多相关文章
- 【剑指offer】栈的压入弹出序列,C++实现(举例)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...
- 剑指offer-面试题31-栈的压入弹出序列-栈
#include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...
- 剑指Offer:栈的压入、弹出序列【31】
剑指Offer:栈的压入.弹出序列[31] 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈 ...
- 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ...
- 【剑指Offer】栈的压入、弹出队列 解题报告(Python)
[剑指Offer]栈的压入.弹出队列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 剑指offer(13)-栈的压入、弹出序列 九度1366
题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...
- Go语言实现:【剑指offer】栈的压入、弹出序列
该题目来源于牛客网<剑指offer>专题. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5 ...
- 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
随机推荐
- @property和@score.setter的用法
@property 把属性装饰成get方法 给属性赋值时,会自动调用@property装饰的方法 只设置属性的@property 时,属性为只读 @score.setter 把属性装饰成set方法 给 ...
- P2690 接苹果 (DP)
补一下dp的思路: dp[i][j]表示第 i 分钟转 j 次所得到的最大值.很容易得到这个dp的推导式. 图中¢()函数表示成立为1, 不成立为0的函数. #include<cmath> ...
- (三)JavaScript 语法
字符串(String)字面量 可以使用单引号或双引号: "John Doe" 'John Doe' 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, ...
- Ambari 使用 Hive View 异常处理
异常:进入Hive View提示user home check fail 详细日志:Service 'userhome' check failed: java.io.FileNotFoundExcep ...
- SpringBoot分布式 - SpringCloud
一:介绍 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...
- Python 学习 第十二篇:pandas
pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,最常用的数据结构是:序列Series和数据框DataFrame,Series类似于numpy中的一维数组,类似于关 ...
- 面试:用 Java 实现一个 Singleton 模式
面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...
- ASP.Net Core2.1中的HttpClientFactory系列二:集成Polly处理瞬态故障
前言:最近,同事在工作中遇到了使用HttpClient,有些请求超时的问题,辅导员让我下去调研一下,HttpClinet的使用方式已经改成了之前博客中提到的方式,问题的原因我已经找到了,就是因为使用了 ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- vue文档全局api笔记1
全局api方法 1.Vue.extend(options) 请注意,extend创建的是一个组件构造器,而不是一个具体的组件实例.所以他不能直接在new Vue中这样使用: new Vue({comp ...