题目:元素出栈、入栈顺序的合法性。如:入栈的序列(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;
}
本文介绍了一种算法,用于判断给定的出栈序列是否能由一个特定的入栈序列通过合法的栈操作得到。该算法使用辅助栈进行模拟,确保栈顶元素与出栈序列匹配,并最终确认两个序列是否符合栈的特性。
3125

被折叠的 条评论
为什么被折叠?



