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

假设有一组数据它的入栈顺序为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





扫描二维码关注公众号,回复: 3750392 查看本文章

代码实现:

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;
}

猜你喜欢

转载自blog.csdn.net/smx_dd/article/details/80428292