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