剑指offer 21 栈的压入、弹出序列
2016-04-07 20:26
453 查看
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路
首先,观察弹出的序列,那么弹出的相邻的两个数在压入的栈的序列如果之间相隔还有其他的数,那么有可能非法。比如给的样例:
输入的序列为1 2 3 4 5。
弹出的序列为4 3 5 1 2,其中在弹出的5和1在输入的序列中是有一个2相隔的,所以是非法的,那么要怎么判断呢,那么就要看2是不是在之前已经被弹出了,如果2没有被弹出,那么就是非法的。
还有考虑给出的数组是不是为空或者为null。
还有就是给出的两个数组的数字是不是都是一样的(数组a中的数字数组b也都有,因为我在代码中是默认都是一样的。)
import java.util.ArrayList; import java.util.Map; import java.util.HashMap; public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { int index_pre=0; int index_next=0; if(pushA==null||popA==null)return false; if(pushA.length==0||popA.length==0)return false; if(pushA.length!=popA.length)return false; for(int ii=0;ii<pushA.length;ii++){ if(popA[0]==pushA[ii]){ index_pre=ii; break; } } Map map_mark=new HashMap(); map_mark.clear(); for(int ii=0;ii<pushA.length;ii++){ map_mark.put(pushA[ii],1); } for(int ii=0;ii<popA.length;ii++){ if(map_mark.get(popA[ii])==null)return false; } map_mark.clear(); int judge=0; map_mark.put(popA[0],1); for(int ii=1;ii<popA.length;ii++){ map_mark.put(popA[ii],1); for(int jj=0;jj<pushA.length;jj++){ if(popA[ii]==pushA[jj]){ index_next=jj; break; } } if(index_next<index_pre-1){ for(int jj=index_next+1;jj<index_pre;jj++){ if(map_mark.get(pushA[jj])==null){return false;} } } } return true; } }
相关文章推荐
- [数学] BZOJ 4459 [Jsoi2013]丢番图
- jq 设置和获取元素内容和属性
- B/S/S 和 C/S/S
- 【前端性能】浅谈域名发散与域名收敛
- HTML图片轮播代码
- Javascript正则表达式完全学习手册
- HTML5 LocalStorage 本地存储
- HTML中的window对象和document对象详解
- 删除HTML元素
- 利用JS做到隐藏div和显示div
- js控制div显示与隐藏
- 增加HTML元素
- 修改HTML元素
- 你不知道的JavaScript--Item37 面向对象高级程序设计
- ReactNative学习十六-View属性及Style
- 【React Native开发】React Native移植原生Android项目(Mac用)
- 访问HTML元素
- 深入理解 JavaScript 中的 replace 方法
- 简单理解 unix (liunx)inode
- JavaScript之继承和prototype