算法练习----栈的压入、弹出序列

题目:

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

 

思路介绍:

有两个数列,比如压入栈的顺序是:1,2,3,4,5 ;有一个弹出序列是:1,2,5,4,3,他的顺序一定是:

  • 压入1,弹出1
  • 压入2,弹出2
  • 压入3,4,5,弹出5,4,3

现在就是先将压栈序列的第一个数,压入栈区,判断栈区的Top是否和弹出序列的第一个数一致,如果一致,则说明第一个数是真确的,那就从栈中弹出第一个数,继续取压栈序列的第二个数,压入栈区,然后比较,如果不一致,那就继续将压栈顺序的第二个数,压入栈区,判断是否和弹出序列的第一个数一致,一次类推。当压栈序列都进入栈区后,和弹出序列不一致,也就是栈区不空,那么就代表弹出序列是错的。

流程图:

 

解题代码:

bool Solution::IsPopOrder(vector<int> pushV, vector<int> popV)
{
	
	int Index = 0;
	stack<int> s;
	for (int i = 0;i < pushV.size();i++)
	{
		s.push(pushV.at(i));

		while (s.empty() == FALSE && s.top() == popV.at(Index) && Index < popV.size())
		{
			s.pop();
			Index++;
		}

	}
	if (s.empty() == TRUE) 
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
	

	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值