栈:在计算机中是一种先进后出的数据结构,栈的操作包括pop(),push(),isEmpty(),peek()等
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解决思路:
首先分析问题:1,2,3,4,5的入栈顺序有:push(1),push(2),push(3),push(4),push(5),
序列4.5.3.2.1的出栈过程是:先入栈1,2,3,4然后4出栈,再入栈5,出栈5,最后把栈里的1,2,3出栈即可,而序列4,3,5,1,2
首先要出栈4,必须要先把1,2,3,4入栈然后4出栈,现在栈顶是3,出栈3,没有问题,然后入栈5,栈里是1,2,5(栈顶是5)所以出栈5也正确,然后现在栈里面就只有1和2了,栈顶是2,这是只能先出栈2,而序列中的数是1,不匹配,所以这就不合法了,
算法设计判断出栈序列的合法性:
借助一个辅助栈,用一个循环来判断这个出栈序列的每一个元素的合法性,首先将入栈序列的第一个值入栈,判断是否等于判断序列的第一个值,如果不等,继续循环入栈序列的下一个元素进行比较,直到相等,然后出栈栈顶元素,,继续不断的循环来判断入栈序列的下一个元素直至入栈序列的每一个元素都比较完。然后如果栈为空则出栈序列合法,否则不合法。
算法如下:
package Neo;
import java.util.Stack;
/**
* @Auther opprash
* @Date 2018\8\31 0031 2:23
*/
public class StackTest {
public static boolean is(int []pushA,int []popA){
if(pushA==null||popA==null ){
return false;
}else {
Stack<Integer> stack=new Stack<Integer>();
int in=0;
for(int i=0;i<pushA.length;i++){
while (stack.push(pushA[i])==popA[in]){
stack.pop();
in++;
}
}
return stack.isEmpty();
}
}
}