栈的压入,弹出序列
#include <iostream> #include <stack> using namespace std; bool IsPopOrder(int *pPush, int *pPop, int length) { if(NULL == pPush || NULL == pPop || 0 >= length) return false; bool isPossible = false; const int *pNextPush = pPush; const int *pNextPop = pPop; stack<int> stackData; while(pNextPop - pPop < length) // 对出栈序列进行测试 { /** * 若出栈序列中有i,则在进栈队列中i之前的元素必然要进栈 */ while(stackData.empty() || stackData.top() != *pNextPop) { if(pNextPush - pPush == length) break; // 进栈队列为空 stackData.push(*pNextPush); ++pNextPush; } if(stackData.top() != *pNextPop) break; // 栈顶元素必然是要出栈元素 stackData.pop(); ++pNextPop; } if(stackData.empty() && pNextPop - pPop == length) { isPossible = true; } return isPossible; }
问题
判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复)
例如
假设入栈的序列为:1 2 3 4 5
那么4 5 3 2 1为一种弹出序列, 4 3 5 1 2不是