栈的压入、弹出序列
2016-04-28 16:14
204 查看
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:
模拟堆栈操作:将原数列依次压栈,栈顶元素与所给出栈队列相比,如果相同则出栈,如果不同则继续压栈,直到原数列中所有数字压栈完毕。检测栈中是否为空,若空,说明出栈队列可由原数列进行栈操作得到。否则,说明出栈队列不能由原数列进行栈操作得到。
package cn.yzx.nowcoder; import java.util.Stack; /** * 题目描述 * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序, * 序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 * * @author yzx * */ public class IsPopOrder { public static void main(String[] args) { int[] pushA = { 1, 2, 3, 4, 5 }; int[] popA = {1,5,3,4,2}; //int[] popA = { 4, 3, 5, 2, 1 }; System.out.println(new IsPopOrder().IsPopOrder(pushA, popA)); } public boolean IsPopOrder(int[] pushA, int[] popA) { if (pushA.length == 0 || popA.length == 0) { return false; } Stack<Integer> stack = new Stack<Integer>(); int j = 0; for (int i = 0; i < popA.length; i++) { stack.push(pushA[i]); /* peek()方法 查看栈顶对象而不移除它 */ while (j < popA.length && stack.size() != 0 && stack.peek() == popA[j]) { stack.pop(); j++; } } return stack.empty() == true; } }
相关文章推荐
- 看懂此文,不再困惑于javascript中的事件绑定、事件冒泡、事件捕获和事件执行顺序
- FFTW程序Demo
- unity3D——自带寻路Navmesh入门教程(二)(转)
- Windows下使用gvim编写Python程序缩进的设置
- 优秀的开源项目整理 ( 更新中 )
- The type sun.management.ManagementFactory is not visible 报错问题
- 合并表记录(map)
- 关于类中域使用基本类型还是包装类的纠结
- 怕自己遗忘的信息
- Android帧动画animation-list在ProgressBar上失效的解决办法
- 苹果系列机型专业刷机,解锁,解ID
- C++Builder 2010 Release版本配置
- 【ILSpy反编译】C# 写的程序反编译查看是不是也太容易了点吧,太恐怖了。。。
- C# winform编程中多线程操作控件方法
- BackgroundWorker Threads and Supporting Cancel
- C++ String Toolkit (StrTk) Tokenizer
- 中缀表达式计算器
- good
- C# 调用控制台程序,并获取输出写入文件
- 正则基础之——环视(Lookaround)