题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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,所以4之前的必须先入栈,在入栈序列中找到这个第一个出栈的4,顺便自定义一个栈stack,让1,2,3,4依次入栈。
stack此时值为{1,2,3,4,}
接下来定义一个指针popIndex指向出现序列的第一个元素,模拟出栈。
stack.pop一次,指针popIndex向后移动。
此时发现stack的栈顶和出栈序列的指针指向的值不相等(3 != 5)
此时再到入栈序列中寻找5,如果没有找到,那么就说明此序列不是出栈序列。
如果找到了,将这个5入栈,此时stack={1,2,3,5};
指针popIndex指向出栈序列中的5,然后出栈一次,popIndex前移,知道popIndex大于出占序列的长度。
代码如下:
public static boolean isPop(String push,String pop)
{
boolean isp = false;
if(push==null || pop==null)return isp;
if(push.length() !=pop.length() )return isp;
if(pop.length()<=0)return isp;
Stack<Integer> st = new Stack<Integer>();
int popIndex=0,pushIndex=0;
while(popIndex < pop.length())
{
for(;pushIndex<push.length();pushIndex++)
{
int temp = push.charAt(pushIndex)-‘0‘;
st.push(temp);
if(pop.charAt(popIndex) == push.charAt(pushIndex))break;
}
//入栈队列中找不到出栈的某一个值
if(pushIndex >= push.length())break;
while(!st.empty()&&st.peek() == pop.charAt(popIndex)-‘0‘)
{
st.pop();
popIndex++;
}
if(st.empty()&&pop.length()==popIndex)isp=true;
pushIndex++;
}
return isp;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014307117/article/details/47205717