题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可以作为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如 序列1、2、3、4、5 是某栈的压栈序列,序列 4、5、3、2、1 是该压栈序列对应的一个弹出序列,但 4、3、5、1、2 就不可能是该压栈序列的弹出序列。
解决这一问题的关键在于,将我们的思维过程转化为具体可行的算法流程,最后付诸于程序实现。
总结入栈和出栈的过程,我们可以找到判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直接把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了而仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
bool isPopOrder(const int* pPush, const int* pPop, int n)
{if (pPush && pPop && n > 0){stack<int> tmp;int j = 0;for (int i = 0; i < n; ++i){if (tmp.empty()) tmp.push(pPush[j++]);if (tmp.top() == pPop[i]){tmp.pop();continue;}else{while (j < n && tmp.top() != pPop[i])tmp.push(pPush[j++]);if (tmp.top() != pPop[i])return false;tmp.pop();}}return true;}return false;
}