栈的压入、弹出序列

来源:互联网 发布:信捷触摸屏编程实例 编辑:程序博客网 时间:2024/05/21 09:29

举个例子:比如:

1,2,3,4,5

4,5,3,2,1就是

而4,3,5,1,2就不是。

#include <iostream>#include <cstdlib>#include <stack>using namespace std;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;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;}// ====================测试代码====================void Test(char* testName, const int* pPush, const int* pPop, int nLength, bool expected){if (testName != NULL)printf("%s begins: ", testName);if (IsPopOrder(pPush, pPop, nLength) == expected)printf("Passed.\n");elseprintf("failed.\n");}void Test1(){const int nLength = 5;int push[nLength] = { 1, 2, 3, 4, 5 };int pop[nLength] = { 4, 5, 3, 2, 1 };Test("Test1", push, pop, nLength, true);}void Test2(){const int nLength = 5;int push[nLength] = { 1, 2, 3, 4, 5 };int pop[nLength] = { 3, 5, 4, 2, 1 };Test("Test2", push, pop, nLength, true);}void Test3(){const int nLength = 5;int push[nLength] = { 1, 2, 3, 4, 5 };int pop[nLength] = { 4, 3, 5, 1, 2 };Test("Test3", push, pop, nLength, false);}void Test4(){const int nLength = 5;int push[nLength] = { 1, 2, 3, 4, 5 };int pop[nLength] = { 3, 5, 4, 1, 2 };Test("Test4", push, pop, nLength, false);}// push和pop序列只有一个数字void Test5(){const int nLength = 1;int push[nLength] = { 1 };int pop[nLength] = { 2 };Test("Test5", push, pop, nLength, false);}void Test6(){const int nLength = 1;int push[nLength] = { 1 };int pop[nLength] = { 1 };Test("Test6", push, pop, nLength, true);}void Test7(){Test("Test7", NULL, NULL, 0, false);}void main(){Test1();Test2();Test3();Test4();Test5();Test6();Test7();system("pause");}


0 0