题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:创建一个临时栈,用来存压入序列的元素,过程举例说明,比如压入序列1 2 3 4 5,弹出序列45321,就要从压入序列第一位开始,存放到临时栈中,首先是1 2 3 4,这时发现4和弹出序列的第一位相等,于是对栈的操作变成将4弹出,这样栈中剩下1 2 3,而弹出序列的下一位是5,栈顶是3,需要继续将压入序列的元素存到栈中,5进栈,然后与弹出序列的第一位(之前第一位是4,因为已经满足要求并弹出,所以第一位变成5),这样栈顶元素变为3,与弹出序列剩余的相同,因此依次弹出3 2 1,符合要求。
另一个例子,压入序列 1 2 3 4 5,弹出序列 4 3 5 1 2 。
同理,1 2 3 4进栈,弹出4 3 ,然后5进栈,弹出5,此时栈顶是2,并且压入队列都已进栈,所以不符合。
以下是Java代码,
1、
import
java.util.ArrayList;
import
java.util.Stack;
public
class
Solution {
public
boolean
IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
if
(pushA.size()!=popA.size())
return
false
;
Stack<Integer>
stack =
new
Stack<Integer> ();
int
i=
0
;
for
(
int
num :popA){
if
(!stack.empty()){
if
(stack.peek()==num){
stack.pop();
continue
;
}
}
if
(i>=pushA.size())
return
false
;
while
(pushA.get(i++)!=num)
{
if
(i>=pushA.size())
return
false
;
stack.push(pushA.get(i-
1
));
}
}
return
true
;
}
}
2、
import
java.util.ArrayList;
import
java.util.Stack;
public
class
Solution {
public
boolean
IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
Stack<Integer>
stack =
new
Stack<Integer>();
boolean
result =
false
;
int
i=
0
;
int
j=
0
;
int
n1 = pushA.size();
int
n2 = popA.size();
while
(j<n2)
{
if
(i<n1
&& pushA.get(i) != popA.get(j))
{
stack.push(pushA.get(i));
i++;
}
else
if
(i<n1
&& pushA.get(i) == popA.get(j))
{
i++;
j++;
}
else
if
(stack.peek()
== popA.get(j))
{
stack.pop();
j++;
}
else
break
;
}
if
(j
== n2)
result
=
true
;
return
result;
}
}
以上代码摘自
牛客网