算法 栈和队列 【LeetCode 946 合法出栈顺序】

本文介绍了一种使用栈来验证给定的入栈序列和出栈序列是否合法的方法。通过模拟入栈和出栈过程,利用栈顶元素与出栈序列首元素的比较,实现了序列合法性的校验。

一、题目

二、思路

准备入栈序列与出栈序列,一个空栈。

其中,入栈系列和出栈序列用vector存储,

其中,出栈序列我们用一个index指向首元素,来模拟队列。

然后元素12345按照顺序入栈。

元素1入栈后,需要判断他和出栈序列中,index指向的元素,也就是队列首元素3是否相同,

如果相同,则同时弹出栈顶元素和队头元素,

直到栈空或栈顶元素与队头元素不相同,

否则,继续将入栈序列中的元素入栈。

经过多轮操作,如果最终栈为空,

则说明出栈顺序合法;

否则不合法。

三、代码

bool validateStackSequence(vector<int>pushed/*入栈序列*/, vector<int>popped/*出栈序列*/)
{
	//建立临时栈,用来判断栈顶元素和出栈队列首元素是否相同
	stack<int> S;
	//计数器,用于出栈序列,模拟队列
	int index = 0;
	//依次将入栈序列从头到尾入栈
	for (int i = 0; i < pushed.size(); i++)
	{
		//入栈
		S.push(pushed[i]);
		//判断栈顶和队头是否相等
		while (!S.empty() && popped[index] == S.top())
		{
			//如果相等,同时弹出栈顶元素与队列头部元素
			//直到栈空或栈顶与队列头部元素不同
			S.pop();//弹出栈顶元素
			index++;//弹出队列头部元素
		}
	}
	//栈为空,则说明合法。
	if (S.empty())
	{
		return true;
	}
	return false;
}

int main()
{
	vector<int>pushed;
	vector<int>popped;
	pushed.push_back(1);
	pushed.push_back(2);
	pushed.push_back(3);
	pushed.push_back(4);
	pushed.push_back(5);
	popped.push_back(3);
	popped.push_back(2);
	popped.push_back(5);
	popped.push_back(4);
	popped.push_back(1);
	cout << validateStackSequence(pushed, popped);
	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值