题目:元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。
思路:借用一个辅助栈,先按照入栈顺序push,直到栈顶元素和出栈序列相等就pop,以此类推,最后栈为空且两个序列都被遍历到。
代码:
bool
IsPopOrder
(
vector
<
int
>
PushV
,
vector
<
int
>
PopV
)
{
/*如果是空或长度不相等,直接退出*/
if
(
PushV
.
empty
() ||
PopV
.
empty
() ||
PushV
.
size
() !=
PopV
.
size
())
return
false
;
stack
<
int
>
s
;
size_t
idx_pop
= 0;
size_t
idx_push
= 0;
/*idx_pop没有遍历到最后时,循环继续*/
while
(
PopV
.
size
() >
idx_pop
){
/*如果栈为空,或者栈顶元素不等于下一个要出栈的,需要继续向栈中push元素*/
while
(
s
.
empty
() ||
s
.
top
() !=
PopV
[
idx_pop
]){
/*如果idx_push遍历到了结尾,跳出循环*/
if
(
idx_push
==
PushV
.
size
())
break
;
s
.
push
(
PushV
[
idx_push
]);
idx_push
++;
}
/*到这里如果栈顶仍然不等于下一个要出栈的,说明序列不合法*/
if
(
s
.
top
() !=
PopV
[
idx_pop
])
break
;
/*到这里说明下一个出栈的一定等于栈顶元素*/
s
.
pop
();
idx_pop
++;
}
/*栈为空 并且idx_pop(和idx_push相等)遍历到了结尾说明合法*/
if
(
s
.
empty
() &&
idx_pop
==
PopV
.
size
())
return
true
;
return
false
;
}