题目见书《剑指offer》168页;
刚开始看到这题的时候一头雾水,因为很久没有接触这类的知识了。
思路:构建一个辅助栈。最重要的是判断栈顶元素与序列元素是否相同,不相同则向辅助栈压入元素。
由于程序摘抄的是书上的内容,本博客只是作为一个笔记,加入了自己的理解部分。
bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
bool bPossible = false;
if(pPush != nullptr && pPop != nullptr && 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;
}
尾记:编程题最重要的是编程思路,先把思路想好了,那么写程序就好办了。