【Java】 剑指offer(31) 栈的压入、弹出序列

本文参考自《剑指offer》一书,代码采用Java语言。html

更多:《剑指Offer》Java实现合集  java

题目 

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的全部数字均不相等。例如序列一、二、三、四、5是某栈的压栈序列,序列四、五、三、二、1是该压栈序列对应的一个弹出序列,但四、三、五、一、2就不多是该压栈序列的弹出序列。数组

思路

  创建一个栈,按照压栈序列依次进行入栈操做,按出栈序列的顺序依次弹出数字。在出栈时,若下一个要出栈的数字与栈顶数字相同则弹出。若是压栈序列中的全部数字都入栈后没有彻底出栈成功则表明两个序列不匹配,返回false。post

测试算例 测试

  1.功能测试(两个数组长度不一样;两个数组对应;两个数组不对应)url

  2.特殊测试(数组为空;null;一个数字的数组)spa

Java代码

//题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是
//否为该栈的弹出顺序。假设压入栈的全部数字均不相等。例如序列一、二、三、四、
//5是某栈的压栈序列,序列四、五、三、二、1是该压栈序列对应的一个弹出序列,但
//四、三、五、一、2就不多是该压栈序列的弹出序列。

public class StackPushPopOrder {
    public boolean isPopOrder(int [] pushA,int [] popA) {
    	if(pushA==null || popA==null)
    		return false;
    	Stack<Integer> stack = new Stack<Integer>();
    	//必须提早判断长度是否相等
    	if(popA.length!=pushA.length || pushA.length==0)
    		return false;
    	int popIndex=0;
    	for(int pushIndex=0; pushIndex<pushA.length; pushIndex++) {
    		stack.push(pushA[pushIndex]); 
    		while(!stack.empty() &&stack.peek()==popA[popIndex]) {
    			stack.pop();
    			popIndex++;
    		}
    	}
    	return stack.empty();
    }
}   

  

收获

  经过举例子,整理清楚逻辑顺序:依次先入栈,再判断是否出栈;出栈序列能实现栈的清空说明两个序列匹配。htm

  

更多:《剑指Offer》Java实现合集  blog

相关文章
相关标签/搜索