验证栈序列

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

//bool validStackSequences(vector<int>& inVec, vector<int>& outVec)
//{
//	//思路分析
//	//元素个数不同时,入栈的数据必然不能输出出栈顺序为outVec的结果
//	//对inVec从前到后依次进行入栈操作,入栈前要与outVec中的参照元素进行比较,最开始outVec的参照元素就是第一个元素
//	//当要入栈元素正好等于outVec的参照元素时,该元素不进行入栈操作,
//	//outVec中的参照元素往后移动,作为新的参照元素
//	//用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
//	//indexOutVec更新新的参照元素
//	//当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动
//
//	stack<int> stack;
//	if (inVec.size() != outVec.size()) return false;
//
//	int indexOutVec = 0;
//	for (int i = 0; i < (int)inVec.size(); i++)
//	{
//		if (inVec[i] == outVec[indexOutVec])
//		{
//			//outVec中的参照元素往后移动
//			indexOutVec++;
//			//outVec[indexOutVec],作为新的参照元素,同时,用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
//			while (!stack.empty() && (stack.top() == outVec[indexOutVec]))
//			{
//				stack.pop();
//				//indexOutVec更新新的参照元素
//				indexOutVec++;
//			}
//		}
//		else
//		{
//			//当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动
//			stack.push(inVec[i]);
//		}
//	}
//
//	//栈为空则表示入栈为inVec的顺序可以输出出栈为outVec的顺序的结果
//	return stack.empty();
//}

//优化
//上面的逻辑省略了一次入栈操作,但是思考一下可以发现
//省略这个操作意义不大,因为即使你不进行入栈
//仍然要用stack的栈顶元素与outvec的参照元素进行比较,判断两者是否移动更新.
//思考一下如果你在相等的情况下也入栈了
//同样用stack的栈顶元素与outvec的参照元素进行比较,然后判断两者是否移动更新.
//逻辑也是正确的
//所以上面那个相等则不入栈的操作反而多搞了一次if判断
bool validStackSequences(vector<int>& inVec, vector<int>& outVec)
{
	//思路分析
	//元素个数不同时,入栈的数据必然不能输出出栈顺序为outVec的结果
	//对inVec从前到后依次进行入栈操作,入栈前要与outVec中的参照元素进行比较,最开始outVec的参照元素就是第一个元素
	//当要入栈元素正好等于outVec的参照元素时,该元素不进行入栈操作,
	//outVec中的参照元素往后移动,作为新的参照元素
	//用栈的栈顶元素与这个新元素进行比较,如果相等,则出栈且outVec中的参照元素往后移动,
	//indexOutVec更新新的参照元素
	//当要入栈元素不等于outVec的参照元素时,该元素进行入栈操作,outVec中的参照元素保持不动

	stack<int> stack;
	if (inVec.size() != outVec.size()) return false;

	int indexOutVec = 0;
	for (int i = 0; i < (int)inVec.size(); i++)
	{
		stack.push(inVec[i]);
		if (inVec[i] == outVec[indexOutVec])
		{
			while (!stack.empty() && (stack.top() == outVec[indexOutVec]))
			{
				stack.pop();
				indexOutVec++;
			}
		}
	}

	return stack.empty();
}

int main()
{
	vector<int> in1 = { 1,2,3,4,5 };
	vector<int> out1 = { 4,5,3,2,1 };

	cout << "in1 和 out1 是否正确的入栈和出栈序列" << validStackSequences(in1, out1) << endl;

	vector<int> in2 = { 1,2,3,4,5 };
	vector<int> out2 = { 4,3,5,1,2 };

	cout << "in2 和 out2 是否正确的入栈和出栈序列" << validStackSequences(in2, out2) << endl;

	int ss;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值