C++经典题目:栈的压入 弹出序列

给定两个整数序列,一个表示栈的压入顺序,任务是判断第二个序列是否可能是对应的弹出顺序。通过创建栈模拟入栈过程,与弹出序列对比,若能完全匹配且栈为空,则返回true,否则false。

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

输入:[1,2,3,4,5],[4,5,3,2,1]     返回true

输入:[1,2,3,4,5],[4,3,5,1,2]     返回false

解题思路如下:

创建一个栈用来保存入栈序列,再创建一个下标i来表示对比序列数字下标。刚开始先入栈,然后将这个入栈的数字和对比序列的第一个数字比较,之后有两种结果:

1:如果不相同,则继续入栈。

2:如果相同:则pop栈顶元素并把i++,注意,在这之后需要继续比较因为有可能会连着好几个数字都相同。

最后就是看返回值,如果全部都能匹配玩这说明出栈序列正确,而且这时候栈被pop完了栈顶为空

如果不能全部匹配,那么栈没有被pop完,出栈序列是错滴。

代码如下

bool IsPopOrder(vector<int> pushV, vector<int> popV)
	{
		stack<int> st;
		int i = 0;
		for (auto pushVal : pushV)
		{
			st.push(pushVal);//每次雷打不动,先入一个数据

			//出栈序列匹配后要持续比较,可能会有多个匹配
			while (!st.empty()&&popV[i] == st.top())
			{
				++i;//相等,++popi
				st.pop();
			}
		}

		return st.empty();
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值