剑指offer31----栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路:建立一个辅助栈,把输入的第一个序列中的数字一次压入该辅助栈,并按照第二个序列的顺序一次从该栈中弹出数字。
例如:压入顺序为1,2,3,4,5,弹出顺序为4,5,3,2,1
1. 先假设有一个辅助栈stack;
2. 此时栈为空,分析弹出序列,第一个为4,那么应该将依次压入1,2,3,4,此时栈顶为4,从栈顶弹出4;
3. 第二个为5,此时栈顶为3,所以将压入序列中剩余数字依次压入栈,直到栈顶为5为止,此时栈中为1,2,3,5,弹出5;
4. 第三个为3,此时栈顶刚好为3,弹出3;
5. 第四个为2,此时栈顶刚好为2,弹出2;
6. 第五个为1,此时栈顶刚好为1,弹出1;
而对于弹出序列为4,3,5,1,2而言
1. 分析弹出序列,第一个为4,那么应该将1,2,3,4依次压入栈,栈顶为4,弹出4;
2. 第二个为3,此时栈顶刚好为3,弹出3;
3. 第三个为5,此时栈顶为2,将剩余数字入栈,直至5,此时栈中为1,2,5,弹出栈顶5;
4. 第四个为1,此时栈顶为2,且所有的数字都已经入栈,所以该序列不是一个有效的出栈序列;
总结: 如果下一个弹出的数字不是栈顶,则需要把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止;如果所有的数字都压入栈顶仍然没有找到下一个弹出的数字,那么该序列不可能是一个有效的弹出序列。
如果我们定义的辅助栈,在入栈序列全部输入完成时,还剩余元素的话,代表当前的输出序列是不存在的。
代码如下:
public class Offer31 {
public static boolean isSame(int[] in, int[] out) {
boolean flag = false;
if (in.length < 1) {
return flag;
}
if (out.length < 1) {
return true;
}
Stack<Integer> stack = new Stack<>();
int inP = 0;
int outP = 0;
int val = 0;
while (inP < in.length) {
val = in[inP];
stack.push(val);
while (stack.size() > 0 && stack.peek() == out[outP]) {
stack.pop();
outP++;
}
inP++;
}
if (stack.size() == 0) {
flag = true;
}
return flag;
}
}
剑指offer31----栈的压入、弹出序列的更多相关文章
- 剑指offer - 栈的压入弹出序列 - JavaScript
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
- 剑指Offer20 栈的压入弹出序列是否正确
/************************************************************************* > File Name: 20_IsPopO ...
- 剑指offer 栈的压入弹出 顺序
判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍 ...
- 【剑指offer】栈的压入弹出序列,C++实现(举例)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...
- 剑指offer-面试题22.栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...
- 剑指Offer 栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 剑指offer——栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个栈是否为该栈的弹出顺序.假设压入栈的所有数字都不相等.例如序列1,2,3,4,5是某个栈的压入顺序,序列4,5,3,2,1是该栈序列的一 ...
- 剑指offer--28.栈的压入、弹出序列
时间限制:1秒 空间限制:32768K 热度指数:300132 本题知识点: 栈 算法知识视频讲解 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假 ...
- 剑指Offer-21.栈的压入、弹出序列(C++/Java)
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 剑指Offer_栈的压入序列是否有对应的弹出序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序. 如:假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...
随机推荐
- 公司PL/SQL考核及小结
一.数据库初始化脚本 -- Create table 学生信息 drop table HAND_STUDENT; create table HAND_STUDENT ( STUDENT_NO ) no ...
- 前端框架:Angular React 和 Vue的比较
前端这几年的技术发展很快,细分下来,主要可以分成四个方面: 1.开发语言技术,主要是ES6&7,coffeescript,typescript等: 2.开发框架,如Angular,React, ...
- new Date,Date.parse()传值
获取时间: 获取1997年10月1号日期 new Date: 当使用 - 拼接年月日时将会使用UTC时区解析参数,会比北京时间快八小时. 当时用 / 拼接年月日时会使用北京的时区去解析参数,取到的是北 ...
- 目录:Matrix Differential Calculus with Applications in Statistics and Econometrics,3rd_[Magnus2019]
目录:Matrix Differential Calculus with Applications in Statistics and Econometrics,3rd_[Magnus2019] Ti ...
- hdfs 配置文件详解
– dfs.name.dir – NameNode 元数据存放位置 – 默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/name – dfs.block.size – ...
- centos7搭建activemq服务
一.下载安装jdk 下载 jdk-8u211-linux-x64.rpm安装: yum -y install jdk-8u211-linux-x64.rpm 二.官网下载 activemq 软件包 官 ...
- ASP.NET c# 实验日记(1)
第一次写有一些紧张,以前学过html,c语言,vb,c#等语言.也自己翻过有关javascript的书,现在的目的是怎么把学习经验写的更具结构化和条理化,大佬勿喷. 在一个集成开发平台里第一步就是新建 ...
- kotlin面向对象之接口、代理与委托、单例模式
接口: 对于什么是接口这里就不概述了,跟java中的概念一样,下面直接上代码进行操练: 而男人跟女人的接口当然也是不同的,很显然男人跟女人最大的差别就是拥有"小弟弟"[我黄我暴利] ...
- PHP+redis消息队列抢购实现
实现功能: 1. 基于redis队列,防止高并发的超卖 2. 基于mysql的事务加排它锁,防止高并发的超卖 基于redis队列工作流程: 1. 管理员根据goods表中的库存,创建redis商品库存 ...
- Codeforces Round #593 (Div. 2) D. Alice and the Doll
题目:http://codeforces.com/problemset/problem/1236/D思路:机器人只能按照→↓←↑这个规律移动,所以在当前方向能够前进的最远处即为界限,到达最远处右转,并 ...