博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer31----栈的压入、弹出序列
阅读量:4615 次
发布时间:2019-06-09

本文共 1340 字,大约阅读时间需要 4 分钟。

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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
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; }}

 

转载于:https://www.cnblogs.com/Booker808-java/p/9279249.html

你可能感兴趣的文章
数据库的创建和删除
查看>>
最简单的三层实例【插入据
查看>>
设计模式学习笔记——Prototype原型模式
查看>>
pom.xml里有红叉报错的解决办法
查看>>
Perl last和next的用法区别
查看>>
Selenium 管理 Cookies
查看>>
exceptionfunction[LeetCode]Permutations
查看>>
bzoj 4595 激光发生器
查看>>
multi cookie & read bug
查看>>
js时间转换
查看>>
(转载) Android Studio你不知道的调试技巧
查看>>
队列实现霍夫曼树
查看>>
关于微信公众平台测试号配置失败的问题
查看>>
【NOIP2001】统计单词个数
查看>>
linux常用端口
查看>>
异常处理
查看>>
/proc/uptime详解
查看>>
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>