面试题22:根据栈的压入序列,判断弹出序列是否合法

本文介绍了一个算法,用于判断给定的出栈序列是否为合法序列。通过使用辅助栈,该算法能够有效地验证出栈序列是否能由特定的进栈序列产生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.输入两个整数序列,第一个式进栈的顺序序列,第二个是出栈的顺序序列,判断出栈的序列是否合法。

分析:先根据出站的序列,来判断是非要进栈,如果当前的栈顶的元素和出站序列中的要比较的元素不相等,剩余的进栈序列继续进栈,直到栈顶的元素和出站的序列的元素相等。如果相等的话,则弹出栈顶的元素,继续比较下一个元素,按照相同的规则,直到所有的进栈序列都进栈,如果出现所有的待进栈的序列都进栈了,但是都没有找到栈顶的元素等于带比较的出站序列中的元素的话,则证明这个出站的序列不是正确的,不可能得到。下面是图示:

能得到的出站的序列


不可能得到的出站序列


源码:

#include<iostream>
#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();//此时栈顶的数据等于nPop序列的元素,可以比较下一个
			pNextPop++;
		}
		if (stackData.empty() && pNextPop - pPop == nLength)//栈为空并且nPop序列中元素全部比较完成,才满足要求
			bPossible = true;
	}
	return bPossible;
}
int main()
{
	const int nLength = 5;
	int push[nLength] = { 1, 2, 3, 4, 5 };
	int pop[nLength] = { 4, 5, 3, 2, 1 };
	int pop_2[nLength] = { 4, 3, 5, 1, 2 };
	bool result = IsPopOrder(push, pop, nLength);
	if (result == true)
		cout << "correct" << endl;
	else
		cout << "error" << endl;
	result = IsPopOrder(push, pop_2, nLength);
	if (result == true)
		cout << "correct" << endl;
	else
		cout << "error" << endl;
	system("PAUSE");
	return 0;
}
结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值