栈应用-栈混洗(CPP实现多版本简单易懂)

该博客探讨了如何验证给定的pushed和popped序列是否可能由初始空栈上的推入和弹出操作产生。通过两种思路模拟栈操作并检查序列的合法性,最终实现一个验证函数。代码示例展示了如何用C++实现这一功能。
摘要由CSDN通过智能技术生成

栈应用-栈混洗

 

问题描述

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

 

思路

思路一

将要检测的pushed和poped模拟成一个向量,从而模拟混洗过程,当poped中的元素等于s中的元素,就进行s.pop(),当pushed中所有元素压入完毕,如果s中为空,则证明true,反之为false

 

思路二

如果pushed和poped为一个栈,就不能随机访问,所以要将poped反向移到新创建的rpoped,这样rpoped中的访问顺序就为poped中的进入顺序,接下来的思路同思路一

 

代码实现

版本一

#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
bool validateStackSequences(vector<int> pushed, vector<int> poped)
{
	stack<int> s;
	int count = 0;
	for (int i = 0; i < pushed.size(); i++)
	{
		s.push(pushed[i]);
		while (!s.empty() && s.top() == poped[count])//有哨兵时,一定要注意数组越界
		{
			s.pop();
			count++;
		}
	}
	return s.empty();
}

int main()
{
	vector<int> v1;
	vector<int> v2;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v2.push_back(3);
	v2.push_back(2);
	v2.push_back(4);
	v2.push_back(1);
	if (validateStackSequences(v1, v2))
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}
	system("pause");
	return 0;
}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ALrKGUP2-1665622696567)(C:\Users\Zhang\AppData\Roaming\Typora\typora-user-images\image-20221012233235326.png)]

 

版本二

#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool validateStackSequences(stack<int> pushed, stack<int> poped)
{
	stack<int> s, rpoped;
	while (poped.size())
	{
		rpoped.push(poped.top());
		poped.pop();
	}
	while(pushed.size())
	{
		s.push(pushed.top());
		pushed.pop();
		while (s.size() && s.top() == rpoped.top())
		{
			s.pop();
			rpoped.pop();
		}
	}
	return s.empty();
}

int main()
{
	stack<int> pushed, poped;
	pushed.push(4);
	pushed.push(3);
	pushed.push(2);
	pushed.push(1);
	poped.push(3);
	poped.push(2);
	poped.push(4);
	poped.push(1);
	if (validateStackSequences(pushed, poped))
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}
	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值