栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值