(输入两个整数序列,第一个序列是一串数字的压入顺序,判断第二个序列是否是该栈数字的弹出顺序。)

我的方法:压入序列是给定的,每一次弹出操作形成一个弹出序列的值,我们从前往后遍历弹出序列,每一次访问弹出序列都代表了一次弹出操作,弹出的值必然是当前栈顶的元素或者是在剩余没有压入的元素序列中。我们要做的是去检查当前弹出的这个元素是否合理,即是否在栈顶或者剩下未压入栈的元素中

    	public boolean check(int[] inSerial, int[] outSerial){
int N = inSerial.length;
//存储已经压入未被弹出的值
Stack<Integer> left = new Stack<Integer>();
int toPush = 0;
int toPop = 0;
//如果还有未被弹出的值或者还有没有被压入的元素,则继续检查弹出序列
while(!left.isEmpty() || toPush < N){
//如果当前弹出元素 并不在栈中,也不是下一个压入元素,则继续检查后一个压入元素。
if(toPush < N && toPop < N && inSerial[toPush] != outSerial[toPop]
&& (left.isEmpty() || left.peek() != outSerial[toPop])){
left.push(inSerial[toPush]);
toPush++;
}
//如果当前弹出元素在栈顶,弹出这个元素,并继续检查下一个弹出元素。
else if(!left.isEmpty() && left.peek() == outSerial[toPop]){
left.pop();
toPop++;
}
//如果当前弹出元素是下一个压入元素,则继续检查下一个弹出元素,同时也将压入元素指针后移。
else if(toPush < N && inSerial[toPush] == outSerial[toPop]){
toPush++;
toPop++;
}
//如果出现 当前弹出元素既不在栈顶,也不在压入元素序列内,则表示这个弹出序列是错误的。
if (toPush == N && !left.isEmpty() && left.peek() != outSerial[toPop]) {
return false;
}
}
return true;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CheckInAndOutSerialForStack c = new CheckInAndOutSerialForStack();
int[] a = new int[]{1,2,3,4,5};
int[] b = new int[]{4,3,2,1,5};
System.out.print(c.check(a, b));
}

《剑指offer》面试题22 栈的压入、弹出序列 Java版的更多相关文章

  1. 剑指Offer:面试题22——栈的压入,弹出序列(java实现)

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

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

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

  3. 剑指offer-面试题22.栈的压入,弹出序列

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

  4. 剑指Offer - 九度1366 - 栈的压入、弹出序列

    剑指Offer - 九度1366 - 栈的压入.弹出序列2014-02-05 20:41 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所 ...

  5. 剑指offer(21)栈的压入、弹出序列

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

  6. 剑指offer二十一之栈的压入、弹出序列

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

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

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

  8. 【剑指Offer】21、栈的压入、弹出序列

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

  9. 剑指offer - 栈的压入弹出序列 - JavaScript

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

  10. 剑指Offer20 栈的压入弹出序列是否正确

    /************************************************************************* > File Name: 20_IsPopO ...

随机推荐

  1. Burpsuite查看和修改请求

    打开上传测试网页(此处是自己搭建的OWASP平台),这个网页只能上传图片格式的文件 上传一张图片: 查看上传图片: 创建一个test.text文件: 配置浏览器代理,IP:127.0.0.1,端口:8 ...

  2. alpine操作

    设置镜像源 使用其他版本把v3.7改成对应版本就行 查看版本 cat /etc/os-release 阿里 echo http://mirrors.aliyun.com/alpine/v3.7/mai ...

  3. SqlServer 随机生成中文姓名(转)

    ,) )) -- 姓氏 ,) )) -- 名字 INSERT @fName VALUES ('赵'),('钱'),('孙'),('李'),('周'),('吴'),('郑'),('王'),('冯'),( ...

  4. UVa 1602 Lattice Animals (STL && 生成n连块 && 无方向形状判重)

    题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...

  5. Python爬虫黑科技(经验)

    "作为一名爬虫工程师,你最需要关注的,是数据的来源" 原文:https://www.jb51.net/article/90114.htm 霍夫曼编码压缩算法 1.最基本的抓站   ...

  6. (77)一文了解Redis

    为什么我们做分布式使用Redis? 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对  ...

  7. [BZOJ4695]最假女选手:segment tree beats!

    分析 segment tree beats!模板题. 看了gxz的博客突然发现自己写的mxbt和mnbt两个标记没用诶. 代码 #include <bits/stdc++.h> #defi ...

  8. CDH搭建和集成spark、kafka操作

    系统:Centos7 CDH版本:5.14.0 请自己提前安装好:mysql.jdk 并下载好相关依赖(每一台机器) yum -y install chkconfig python bind-util ...

  9. OOM和SOF代码

    OutOfMemoryError大数组,例如图片加载. public class MockOutOfMemoryError { public static void main(String[] arg ...

  10. 在HTML标签元素中,绑定JS函数

    <a onclick="ShowMsg(this)" id="myA" href="#">按钮</a> //JS方法 ...