题目来自剑指Offer
题目:
思路:根据弹出序列和一个辅助栈来模拟进栈操作。
对于弹出序列中的一个元素V,
1、如果栈为空或者栈顶元素不等于V,则去压栈序列中寻找结点V,
(1)如果在压栈序列中能找到结点V,并把寻找结点V的过程中遇到的顶点压入辅助栈中。
(2)如果不能找到结点V,则表示该元素已经在栈中或者该元素不存在,此时该数字是不合法的弹出序列。
2、如果栈顶元素等于V,则辅助栈中的元素出栈。继续处理下一个元素。
代码
#include <iostream> #include <assert.h> using namespace std; bool IsPopOrder(int nArrPop[],int nArrPush[],int nLen) { assert(nArrPop && nArrPush && nLen > 0); int* Stack = new int[nLen]; int nTop = -1; int nCurPush = -1; int nCurPop = 0; while (nCurPop < nLen) { while ((-1 == nTop || Stack[nTop] != nArrPop[nCurPop]) && nCurPush < nLen - 1) { Stack[++nTop] = nArrPush[++nCurPush]; } if (Stack[nTop] == nArrPop[nCurPop]) { nCurPop++;//处理出栈序列中的元素 nTop--; //栈中元素出栈 continue; } if (nCurPush == nLen - 1) //出栈序列中一个元素到入栈序列中没找着 { return false; } } return true; } int main() { //int nArrPush[5] = {1,2,3,4,5}; //int nArrPop[5] = {4,3,5,1,2}; //int nArrPush[5] = {1,2,3,4,5}; //int nArrPop[5] = {4,3,5,2,1}; int nArrPush[5] = {1}; int nArrPop[5] = {1}; if (IsPopOrder(nArrPop,nArrPush,1)) { cout<<"合法出栈序列!"<<endl; } else { cout<<"不合法出栈序列!"<<endl; } system("pause"); return 1; }