栈的压入弹出序列

题目描述:

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

 解读:(借助于辅助栈)

  • 1入栈,栈顶1!=4,继续入栈
  • 2入栈,1,2,栈顶2!=4,继续入栈
  • 3入栈,1,2,3,栈顶3!=4,继续入栈
  • 4入栈,1,2,3,4,栈顶4==4,把4弹出,1,2,3,栈顶3!=4,继续入栈
  • 5入栈,1,2,3,5,栈顶5==5,把5弹出,1,2,3,栈顶3==3,把3弹出,1,2,栈顶2==2,把2弹出,1,栈顶1==1,把1弹出
  • 最后弹出序列是4,5,3,2,1
  • 总结:如果下个是在序列中要弹出的数据正好是栈顶数据,则直接弹出(弹出完,再看栈顶数据是否和下一个要弹出的数据相等),如果和栈顶数据不相等,则把数据继续压入栈,每压入一个数据进去,看一下栈顶数据是否和序列中要弹出的是否相等,一直下去,一直到数据全部都压入栈了,看从栈中弹出的数据是什么情况。

下表列出了1,2,3,4,5与4,5,3,2,1相对应的进入与弹出的顺序:

步骤操作栈中数据弹出的数据栈顶数据
1压入11不弹出,只压入1
2压入21,2不弹出,只压入2
3压入31,2,3不弹出,只压入3
4压入41,2,3,4不弹出,只压入4
5弹出41,2,343
6压入51,2,3,5不弹出,只压入5
7弹出51,2,353
8弹出31,232
9弹出2121
10弹出11

但是对于 1,2,3,4,5要弹出4,3,5,1,2会出现下表所示情况(当把所有数据都压入进去了,还没有把所要的数按顺序弹出来):

步骤操作栈中数据弹出的数据栈顶数据
1压入11不弹出,只压入1
2压入21,2不弹出,只压入2
3压入31,2,3不弹出,只压入3
4压入41,2,3,4不弹出,只压入4
5弹出41,2,343
6弹出31,232
7压入51,2,5不弹出,只压入5
8    
9    
10    

 代码:

class solution{
	public bool IsPopOrder(vector<int> pushVec,vector<int> popVec)
	{
		vector<int>::iterator pushVec_iter=pushVec.begin();
		vector<int>::iterator popVec_iter=popVec.begin();
		stack<int> S;
		
		while(popVec_iter!=popVec.end())
		{			
			while((S.empty()||S.top()!=*popVec_iter)&&pushVec_iter!=pushVec.end())
			{
				S.push(*pushVec_iter);		
				pushVec_iter++;
			}
			if(S.top()!=*popVec_iter);
				break;
			S.pop();
			popVec_iter++;
		}
		if(S.empty()&&popVec_iter==popVec.end())
			return true;
		else
			return false;
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值