元素入栈、出栈的合法性检测

本文介绍了一种算法,用于检查给定的出栈序列是否可以通过特定的入栈序列实现。通过对比栈顶元素与期望出栈元素来判断序列的有效性。

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

我们知道  栈的特性:后进先出 

在给定数据入栈顺序的情况下,我们能改变的就是  改变出栈顺序 从而达到不同的效果。但是如果给出了出栈的顺序,我们能通过一个程序检测它是不是 可以由入栈的顺序 得到。


方法:将入栈和出栈的顺序通过两个vector 传进函数,利用一个栈S,每次比较S.top() 和V2的元素  相等则 (S出栈,v2后移);不相等则 (S入栈,V2后移)


代码:

<span style="font-family:Microsoft YaHei;">template<typename T>
bool CheckOutStack(const vector<T>& v1, const vector<T> v2)
{
	if (v1.size() != v2.size())
	{
		return false;
	}
	stack<T> S;
	size_t index1 = 0;  //栈S 的下标 
	size_t index2 = 0;  //输出顺序v2的下标
	while (index2< v2.size())
	{
		while (S.empty() || S.top() != v2[index2])//一直找到与 v2的第一个元素相等的位置
		{
			if (v1.size() > index1)  //v1没有全部入 栈S  , 继续入栈
			{
				S.push(v1[index1++]);
			}
			else     //入栈完了 , 还没有相等  则返回false
			{
			return false;
			}
		}	
		//来到下面 说明前面有相等的元素

		S.pop();//出栈一次,v2后移一位
		index2++;
		}
	return true;
}</span>

//2016-10-3改进

bool CheckOutStack(const vector<int> v1, const vector<int> v2)
{
	int size1 = v1.size();
	int size2 = v2.size();
	if (size1 != size2)
		return false;

	stack<int> s;
	int  index1= 0;
	int  index2 = 0;
	while (size1 >index1)
	{
		while (s.empty() || v1[index1] != v1[index2]) //不相等才入栈
		{
			if (size2 > index2)  //已经遍历v2都没有发现与v1元素相等的  ,那么就是不合法
			{
				s.push(v2[index2++]);
			}
			else
				return false;
		}
		s.pop();
		index1++;
	}
	return true;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值