// 面试题31:栈的压入、弹出序列
// 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是
// 否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、
// 5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但
// 4、3、5、1、2就不可能是该压栈序列的弹出序列。
static bool is_push_pop(const std::vector<int>& push, const std::vector<int>& pop)
{
if(push.size()!=pop.size() || push.empty())
{
return false;
}
bool is_yes = false;
std::stack<int> stack;
size_t pu=0, po=0;
for(; pu<push.size() && po<pop.size();)
{
while(pu<push.size() && (stack.empty() || stack.top() != pop[po]))
{
stack.push(push[pu++]);
}
if(stack.top() != pop[po])
{
break;
}
stack.pop();
po++;
}
if(stack.empty() && po == pop.size())
{
is_yes = true;
}
return is_yes;
}