剑指offer系列之二十:栈的压入、弹出序列
2015-12-08 14:23
357 查看
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
要判断一个序列是不是另一个序列的弹出序列,首先我们得知道栈的特点是FIFO,其次,由于压入序列是确定的(这里指的“确定”是说相对位置是确定的),就是说压入序列之间的元素可能会经历压入后马上被弹出的情况。具体思路是:根据弹出序列的第一个值,判断在该元素之前被压入栈的所有元素,并对压入栈的栈顶元素与弹出序列的第一个值进行比较,如果相等,则继续判断下一个元素,继续判断该元素之前需要压入栈中的所有元素,仍然进行比较,如果相等,继续判断下一个元素;如果所有的元素都被压入栈中,但是两者仍然不相等,说明弹出序列不可能是原序列的弹出序列。这样一直判断直到弹出序列的最后一个元素。
那么根据这种思路,可以写出如下代码(已被牛客AC):
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
要判断一个序列是不是另一个序列的弹出序列,首先我们得知道栈的特点是FIFO,其次,由于压入序列是确定的(这里指的“确定”是说相对位置是确定的),就是说压入序列之间的元素可能会经历压入后马上被弹出的情况。具体思路是:根据弹出序列的第一个值,判断在该元素之前被压入栈的所有元素,并对压入栈的栈顶元素与弹出序列的第一个值进行比较,如果相等,则继续判断下一个元素,继续判断该元素之前需要压入栈中的所有元素,仍然进行比较,如果相等,继续判断下一个元素;如果所有的元素都被压入栈中,但是两者仍然不相等,说明弹出序列不可能是原序列的弹出序列。这样一直判断直到弹出序列的最后一个元素。
那么根据这种思路,可以写出如下代码(已被牛客AC):
package com.rhwayfun.offer; import java.util.ArrayList; public class StackPushPopSequence { public boolean IsPopOrder(int[] pushA, int[] popA) { boolean possible = false; ArrayList<Integer> data = new ArrayList<Integer>(); if (pushA.length > 0 && popA.length > 0 && pushA.length == popA.length) { int len = pushA.length; //当前元素 int pop = 0; //下一个弹出的元素 int nextPop = 0; int push = 0; //下一个压入的元素 int nextPush = 0; int index = -1; while(nextPop - pop < len){ //如果弹出的元素与第一个元素不相等就一直添加元素直到相等 while(data.size() == 0 || data.get(index) != popA[nextPop]){ //当全部元素添加完毕之后,结束循环 if(nextPush - push == len) break; data.add(pushA[nextPush]); index++; nextPush++; } if(data.get(index) != popA[nextPop]) break; //移除第一个比较的元素 data.remove(index--); nextPop++; } //在集合全部元素比较完毕且弹出序列也比较完毕,返回true if(data.size() == 0 && nextPop - pop == len) possible = true; } return possible; } public static void main(String[] args) { int[] pushA = new int[]{1,2,3,4,5}; int[] popA = new int[]{4,5,3,1,2}; System.out.println(new StackPushPopSequence().IsPopOrder(pushA, popA)); } }
相关文章推荐
- jstl foreach 取index
- 网页中运行JS代码
- win10系统ie浏览器不能打开html的解决办法
- js返回上一操作
- jquery相关校验以及jquery其他知识总结
- HTML 表单和验证事件
- bootstrap-table插件数据加载方式
- 开发备忘:AngularJS Syntax error, unrecognized expression in template file
- H5 progress标记
- 剑指offer系列之十九:包含min函数的栈
- jsp获取当前页面url(带参数)
- 关于缓存buffer一个经典的解析
- jQuery ajax跨域调用出现No Transport
- jQuery animate动画精讲
- 【css】a标签的用法
-  |"|&|<|>等html字符转义
- 2015年11月前端培训记录
- 利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)
- 玩转Protocol Buffers
- js日期计算及快速获取周、月、季度起止日,获取指定日期周数以及星期几的小例子