题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路介绍:
有两个数列,比如压入栈的顺序是:1,2,3,4,5 ;有一个弹出序列是:1,2,5,4,3,他的顺序一定是:
- 压入1,弹出1
- 压入2,弹出2
- 压入3,4,5,弹出5,4,3
现在就是先将压栈序列的第一个数,压入栈区,判断栈区的Top是否和弹出序列的第一个数一致,如果一致,则说明第一个数是真确的,那就从栈中弹出第一个数,继续取压栈序列的第二个数,压入栈区,然后比较,如果不一致,那就继续将压栈顺序的第二个数,压入栈区,判断是否和弹出序列的第一个数一致,一次类推。当压栈序列都进入栈区后,和弹出序列不一致,也就是栈区不空,那么就代表弹出序列是错的。
流程图:
解题代码:
bool Solution::IsPopOrder(vector<int> pushV, vector<int> popV)
{
int Index = 0;
stack<int> s;
for (int i = 0;i < pushV.size();i++)
{
s.push(pushV.at(i));
while (s.empty() == FALSE && s.top() == popV.at(Index) && Index < popV.size())
{
s.pop();
Index++;
}
}
if (s.empty() == TRUE)
{
return TRUE;
}
else
{
return FALSE;
}
}