面试题33-栈的压入、弹出序列

题目

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

方法:辅助栈

建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。

class Solution {
public:
	bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
		stack<int>stk;
		int n = (int)pushed.size();
		if (n == 0)
			return true;
		int i = 0;
		//弹出序列的首个元素之前的元素入栈
		while (pushed[i] != popped[0])
		{
			stk.push(pushed[i++]);
		}
		stk.push(pushed[i++]);
		//弹出序列为空退出循环
		while (!popped.empty())
		{
			//弹出序列和辅助序列同时弹出
			if (!stk.empty()&&popped.front() == stk.top() )
			{
				popped.erase(popped.begin(), popped.begin() + 1);
				stk.pop();
			}
			//否则从压入序列中不断压入数组到辅助栈中
			else
			{
				//索引大于数组末尾元素索引,退出
				if (i >=n)
					return false;
				
					if (pushed[i] == popped.front())
					{
						stk.push(pushed[i++]);
						continue;//进入下次循环
					}						
					stk.push(pushed[i++]);				
			}
		}
		return true;
	}
};
  1. 时间复杂度:O(N),一遍循环
  2. 空间复杂度:O(N),辅助栈最多存放N个元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值