思路:参数传一个入栈顺序和出栈顺序。
定义一个辅助栈,循环条件是压入栈的元素个数。
依次把入栈序列的元素压入辅助栈中,如果某一次辅助栈栈顶==出栈序列栈顶并且辅助栈不为空,则把辅助栈pop,并在出栈次数上++。
如果出了循环,辅助栈为空并且入栈次数等于出栈次数,则是合法的序列。
否则缺一不可,就是不合法的。
bool IsPopOrder(vector<int> pushV, vector<int> popV)
{
//如果两个长度不一样或者其中有一个size==0,则一定是错的
if (pushV.size() != popV.size() || pushV.size() == 0 || pushV.size() == 0)
return false;
stack<int> stackData;
//出栈次数
size_t pop_idx = 0;
//入栈次数
size_t push_idx = 0;
//按照入栈顺序依次push
for (; push_idx < pushV.size(); ++push_idx)
{
stackData.push(pushV[push_idx]);
//如果栈顶元素==出栈序列第pop_idx个,pop_idx从0开始累加
while (stackData.size() != 0 && stackData.top() == popV[pop_idx])
{
stackData.pop();
pop_idx++;
}
}
//如果栈为空并且两个idx相同,说明已经全部出栈,出栈顺序合法
if (stackData.empty() && push_idx == pop_idx)
return true;
//否则不合法
return false;
}