元素入栈、出栈的合法性判断

本文介绍了一种使用栈来判断一组数据是否为有效出栈顺序的方法。通过定义两个数组表示入栈和出栈顺序,并利用栈进行比对,最终确定出栈顺序是否合法。

假设有一组数据它的入栈顺序为1、2、3、4、5,那么它的出栈顺序有很多种可以是1、2、3、4、5,也可以是4、5、3、2、1。那么我们可以写一个程序来判断一组数据是不是合法的出栈顺序。

思路:可以用栈来解决这类问题,定义一个栈s,首先这组数据要和入栈数据的个数一样,否则不合法。我们可以定义两个数组arr1和arr2。数组arr1为入栈顺序,arr2为出栈顺序。分别定义两个指针p、q指向数组的首元素。假如p和q指向的元素相等则指针分别向后加一,指向下一个元素。若两指针指向的元素不等则判断栈s是否为空,若为空则将p指向的元素入栈,再将p指向下一个元素;若不为空判断栈顶元素和q所指向的元素是否相等,若相等则删除栈顶元素,q指向下一个元素再与栈顶元素比较,若不相等则将p指向的元素入栈;当arr1中所有数据都操作完成后,将栈顶元素和q指向的元素比较,若相等则将q指向下一个元素并删除栈顶元素再与新的栈顶元素比较,直到栈为空,贼说明出栈顺序合法,若不相等贼说明出栈顺序不合法。

下面我们举两个列子:假设入栈顺序为1、2、3、4、5,出栈顺序为4、5、3、2、1。

列子二:入栈顺序为1 、2 、3 、4 、5,出栈顺序为3、4、2、1、5

代码实现:

int IsRightOrder(int arr1[], int arr2[], Stack*s, int sz)
{
	int *p = arr1;
	int *q = arr2;
	for (int i = 0; i < sz; i++)
	{
		if (*p == *q)
		{
			p++;
			q++;
		}
		else
		{
			if (StackEmpty(s) == 1)
			{
				StackPush(s, *p);
				p++;
			}
			else
			{
				while (*p != *q)
				{
					if (*q == StackTop(s))
					{
						StackPop(s);
						q++;
					}
					else
						break;
				}
				StackPush(s, *p);
				p++;
			}
		}
	}
	while (StackEmpty(s) != 1)
	{
		if (*q != StackTop(s))
		{
			return 0;
		}
		StackPop(s);
		q++;
	}
	return 1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值