题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。
#include<iostream>
#include<stack>
using namespace std;
bool IsPopOrder(const int*pPush, const int*pPop, int length)
{
//初始判断标志为false
bool bPossible = false;
//判断输入是否合法
if (pPush != nullptr&&pPop != nullptr&&length > 0)
{
const int*pNextPush = pPush;
const int*pNextPop = pPop;
//定义一个辅助数据栈
std::stack<int> stackData;
//当弹出序列没有遍历完时
while (pNextPop - pPop < length)
{
//当辅助数据栈为空时或者辅助数据栈的栈顶元素不等于弹出序列的栈顶元素时
while (stackData.empty() || stackData.top() != *pNextPop)
{
//若压入序列已经遍历完时,结束本次循环,否则将压入序列的栈顶元素压入辅助数据栈,同时pNextPush++
if (pNextPush - pPush == length)
break;
stackData.push(*pNextPush);
++pNextPush;
}
//当辅助数据栈的栈顶元素不等于当前弹出数据栈的栈顶元素时,表明压入序列和弹出序列不对应,结束循环返回false
if (stackData.top() != *pNextPop)
break;
//否则弹出辅助数据栈栈顶元素,同时将pNextPop++
stackData.pop();
++pNextPop;
//当辅助数据栈为空且弹出序列已遍历完时,表明压入序列和弹出序列对应,此时返回ture
if (stackData.empty() && pNextPop - pPop == length)
bPossible = true;
}
return bPossible;
}
}
// ====================测试代码====================
void Test1()
{
const int nLength = 5;
int push[nLength] = { 1, 2, 3, 4, 5 };
int pop[nLength] = { 4, 5, 3, 2, 1 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
void Test2()
{
const int nLength = 5;
int push[nLength] = { 1, 2, 3, 4, 5 };
int pop[nLength] = { 3, 5, 4, 2, 1 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
void Test3()
{
const int nLength = 5;
int push[nLength] = { 1, 2, 3, 4, 5 };
int pop[nLength] = { 4, 3, 5, 1, 2 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
void Test4()
{
const int nLength = 5;
int push[nLength] = { 1, 2, 3, 4, 5 };
int pop[nLength] = { 3, 5, 4, 1, 2 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
// push和pop序列只有一个数字
void Test5()
{
const int nLength = 1;
int push[nLength] = { 1 };
int pop[nLength] = { 2 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
void Test6()
{
const int nLength = 1;
int push[nLength] = { 1 };
int pop[nLength] = { 1 };
if (IsPopOrder(push, pop, nLength))
printf("True!!\n");
else
printf("False!!\n");
}
void Test7()
{
if (IsPopOrder(nullptr, nullptr, 0))
printf("True!!\n");
else
printf("False!!\n");
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
return 0;
}