1.问题描述
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。
2.分析
例如序列A{1,2,3,4,5}
,序列B{4,5,3,2,1}
。序列A是压人序列,序列B是弹出序列。
第一:需要一个辅助栈,模拟栈的压入弹出。序列B中元素‘4’不在栈中(现在栈为空),在把序列A中1,2,3,4
都压入栈中,弹出栈的顶元素,即4
,之后栈中元素是1,2,3
。
后面依次类推,序列B中元素5
不在栈中,不在栈中,把序列A中5
压入栈中,栈中元素为1,2,3,5
,弹出栈中元素,即5,之后栈中元素是1,2,3
序列B中元素3
,在栈中,则弹出栈顶元素,即3,之后栈中元素是1,2
序列B中元素2
,在栈中,则弹出栈顶元素,即2,之后栈中元素是1
序列B中元素1
,在栈中,则弹出栈顶元素,即1,之后栈中元素是为空
最后,应为已经序列B中元素都访问完,都在栈中可以找到。所以则这个序列是正确的。
3.源代码:
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
int pushSize = pushV.size();
int popSize = popV.size();
if(pushSize != popSize || pushSize == 0)
return false;
stack<int> nums;
int pushIndex = 0;
for(int i = 0; i < popSize; ++i)
{
int value = popV[i];
if(nums.empty() || value != nums.top())
{
//把pushV中的值压入nums中
while(pushIndex < pushSize )
{
nums.push(pushV[pushIndex]);
if(value == pushV[pushIndex++])
break;
}
}
if(value != nums.top())
return false;
else
nums.pop();
}
return true;
}
4.结论
可以画一个草图,模拟这个过程,之后分析清楚之后才开始编程。否则不容易想出来。每次在函数入口处采取防御性编程,处理无效的输入。