面试题22 栈的压入、弹出序列
2016-06-14 12:24
302 查看
题目:
输入人两个整数数列,第一个序列为栈的压入序列,判断第二个序列是否为栈的弹出序列。输入:
压入序列A:1,2,3,4,5和弹出序列B:4,5,3,1,2输出:
false解题思路:
我们需要一个辅助栈和两个指向序列A和B的指针pushNext(指向序列A的第一个元素),popNext(指向序列B的第一个元素),栈的作用是压入和弹出 序列A。每次压入的时候,我们需要做对比,如果栈顶不等于popNext的所指元素,那么栈就压入pushNext所指向的元素,同时pushNext向后移动,如果栈顶等于popNext所指向的元素,我们就出栈,同时popNext向前移动。以上不停循环,直到popNext大于序列总长度为止。当然也有意外情况,比如所有序列A都压入栈之后 都没有找到弹出序列B的下一个数字,我们认为B不是A的弹出序列。Java代码实现:
public static void main(String[] args) { // TODO Auto-generated method stub int[] arrPush={1,2,3,4,5}; //压入序列A int[] arrPop={4,5,3,1,2}; //弹出序列B boolean a=isPopOrder(arrPush, arrPop, 5); System.out.println(a); } private static boolean isPopOrder(int[] arrPush,int[] arrPop,int nLength){ if(arrPop==null ||arrPush==null|| nLength<=0){ return false; } int pushNext=0; int popNext=0; Stack<Integer> dataStack=new Stack<Integer>(); while(popNext<nLength){ while(dataStack.empty()|| dataStack.lastElement()!=arrPop[popNext]){ //界限判断,压入栈指针始终不超过序列长度 if(pushNext==nLength){ System.out.println(pushNext); break; } dataStack.push(arrPush[pushNext]); pushNext++; } //如果循环完了压入栈的栈顶元素依然不等于弹出序列,则退出循环 if(dataStack.lastElement()!=arrPop[popNext]){ break; } //弹出压入栈元素 dataStack.pop(); //压入栈序列指针向后移动 popNext++; } //如果都为空,则说明两个栈元素全部可以出栈,返回true if(dataStack.empty()&&popNext==nLength){ return true; } return false; }
相关文章推荐
- Java程序员也应该知道的系统知识系列之(网卡,cpu,内存,硬盘,虚拟化)
- 编程之法:面试和算法心得
- 要准备了:JAVA面试题及答案汇总
- 腾讯面试全程
- 面试腾讯全过程
- 程序员,应该掌握的英语词汇
- 面试题21 包含Min函数的栈
- 非技术相关的面试技巧(文章内容来自他人博客)
- 升级您的ERP系统
- 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
- Android面试题(文章内容来自他人博客)
- 与WWDC大会同步,黑马程序员iOS4.0课程震撼出炉
- Java笔试面试题整理第八波
- 面试题47-2:不使用新的变量,交换两个变量的值
- 面试题47:不用加减乘除做加法
- 程序员面试50题(1)—查找最小的k个元素[算法]
- 运维面试题和答案
- 求职前夕的不眠夜
- 大数相加 面试题
- 面试题19 二叉树的镜像