剑指offer-面试题22:栈的压入、弹出序列
2016-04-01 11:36
435 查看
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设入栈的所有数字均不相等。
思路:用一个栈来模拟入栈过程。如果弹出序列的元素a不等于栈顶,那么说明它还没有入栈,从压入顺序里将元素a以及它之前的元素全部入栈。如果所有压入顺序中的元素都已入栈还是没有在栈顶找到元素a,说明弹出序列是错误的。如果元素a刚好等于栈顶,直接出栈。最后的过程应该是所有元素都出栈而且弹出序列的所有元素都和栈顶比较完。
bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
bool bPossible = false;
if(pPush != NULL && pPop != NULL && nLength > 0)
{
const int* pNextPush = pPush;
const int* pNextPop = pPop;
std::stack<int> stackData;
while(pNextPop - pPop < nLength)
{
// 当辅助栈的栈顶元素不是要弹出的元素
// 先压入一些数字入栈
while(stackData.empty() || stackData.top() != *pNextPop)
{
// 如果所有数字都压入辅助栈了,退出循环
if(pNextPush - pPush == nLength)
break;
stackData.push(*pNextPush);
pNextPush ++;
}
if(stackData.top() != *pNextPop)
break;
stackData.pop();
pNextPop ++;
}
if(stackData.empty() && pNextPop - pPop == nLength)
bPossible = true;
}
return bPossible;
}
思路:用一个栈来模拟入栈过程。如果弹出序列的元素a不等于栈顶,那么说明它还没有入栈,从压入顺序里将元素a以及它之前的元素全部入栈。如果所有压入顺序中的元素都已入栈还是没有在栈顶找到元素a,说明弹出序列是错误的。如果元素a刚好等于栈顶,直接出栈。最后的过程应该是所有元素都出栈而且弹出序列的所有元素都和栈顶比较完。
bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
bool bPossible = false;
if(pPush != NULL && pPop != NULL && nLength > 0)
{
const int* pNextPush = pPush;
const int* pNextPop = pPop;
std::stack<int> stackData;
while(pNextPop - pPop < nLength)
{
// 当辅助栈的栈顶元素不是要弹出的元素
// 先压入一些数字入栈
while(stackData.empty() || stackData.top() != *pNextPop)
{
// 如果所有数字都压入辅助栈了,退出循环
if(pNextPush - pPush == nLength)
break;
stackData.push(*pNextPush);
pNextPush ++;
}
if(stackData.top() != *pNextPop)
break;
stackData.pop();
pNextPop ++;
}
if(stackData.empty() && pNextPop - pPop == nLength)
bPossible = true;
}
return bPossible;
}