题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。例如序列 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,2,3,4 ,然后弹出4,再压入5,然后弹出5,最后依次弹出3,2,1,那么弹出序列就是4,5,3,2,1了;对于弹出序列4,3,5,1,2来说,先压入1,2,3,4,然后弹出4,3,再压入5,然后弹出5,最后栈中剩下1,2,弹出顺序只有2,1,整个弹出顺序是4,3,5,2,1,并不能根据给出的弹出序列弹出,所以第二个就不符合条件。模拟完示例后,根据上述思路,将两个整数序列放入两个数组中,另外需要一个辅助list,首先,将压入序列依次放入list中直到要压入的元素和弹出序列剩余的元素的第一个元素相等,则删除这个元素,然后判断下一个是不是和要弹出的元素相等,如相等则重复上述删除操作,不相等则从上述压栈开始操作,如果所有的元素都入栈了仍然没有找到下一个弹出元素,则不符合。
代码如下:
import java.util.*;
public class Main24
{
public static void main(String[] args)
{
int[] pushLine = {1,2,3,4,5};
int[] popLine = {4,5,2,3,1};
System.out.println(new Main24().isOrder(pushLine,popLine));
}
public boolean isOrder(int[] PushLine, int[] PopLine) //PushLine为压入栈的顺序,PopLine为出栈的顺序,这里的入栈和出栈可能交叉进行,不是只能一次全部进栈完成或出栈完成
{
boolean isCould = false; //是否初入栈成功
ArrayList<Integer> tempList = new ArrayList<Integer>(); //辅助列表,模拟栈
int allLen = PushLine.length; //栈中数据的大小
int nextPush = 0; //下一个要压入栈的元素(即下一个进入list的元素的编号)
int nextPop = 0; //下一个要弹出栈的元素(即下一个要从list中去掉的元素的编号)
int index = -1; //索引
while(nextPop<allLen)
{
while(tempList.size()==0 || tempList.get(index)!=PopLine[nextPop]) //向辅助list中添加元素,直到栈顶(list末尾)元素与弹出的元素相同
{
if(nextPush==allLen) //当全部压入栈中则退出
break;
tempList.add(PushLine[nextPush]); //将元素压入辅助栈(即添加进list中)
nextPush++;
index++;
}
if(tempList.get(index)!=PopLine[nextPop]) //如果栈顶元素和要弹出元素不相等,则不可以
break;
tempList.remove(index); //弹出栈顶元素即将list的末尾元素移除
index--;
nextPop++;
}
if(nextPop==allLen && tempList.size()==0) //如果可以全部按照指定的顺序弹出,那么就成功
isCould = true;
return isCould;
}
}