给出入栈顺序,判断元素出栈顺序的合法性

【思路】

给出入栈顺序,判断出栈顺序的合法性。

大致算法如下:


以入栈顺序 1 2 3 4 5,出栈顺序2 1 3 5 4 为例

1.先判断p1 p2不相等,1入栈,p1++然后p1和p2相等,p1++,p2++;

2.判断栈顶元素1和p2相等,则出栈且p2++;

3.p1的值和p2相等,都为三,则p1++,p2++;

4.s为空,p2->5和p1->4不相等,则4入栈,p1++;

5.此时p1->5,p2->5,s->4,p1==p2,则p2++到4,p1到头,则将s栈里的元素拿出与p2比较,相等,出栈。

6.p2到了结尾,p1也到了结尾,s栈为空,则这个序列是正确的。

【代码如下】

bool Judge(int *p1,int *p2,int len1,int len2)
{
	if ( (!p1)||(!p2)||(len1 != len2)) //如果p1 p2长度不同或者为空,直接返回
	{
		return false;
	}
	stack<int> s;
	int i = 0;//p1
	int j = 0;//p2
	while (j < len2)
	{
		if (!s.empty() && s.top() == p2[j])  //s不为空,且s栈顶与p2相等 
		{
			s.pop();    //s出栈,p2++
			j++;
		}
		else  //s为空或者s不为空但是栈顶和p2不等时,都要比较p1和p2的值
		{
			if (p1[i] == p2[j])  //如果相等
			{
				++i;
				++j;
			}
			else  //如果不等
			{
				s.push(p1[i]);
				++i;
			}
			if (i > len1)  //防止p1越界,但是有不能让它到了尽头就退出,应该过了最后一个再退出
				break;
		}
	}
	if (s.empty())
		return true;

	return false;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值