出栈入栈合法序列检验

题目

元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1)

分析

这个问题需要将in 数组不停的入栈将每个入栈的元素与out 比较,相同的就出栈,否则继续入栈,然后直到in 数组已经没有元素可以入栈,接着就是逐个比较剩下的元素,每一个元素都要匹配才可以认定是匹配的!如下图:
这里写图片描述

代码

#include "Stack.h"

int IsLegal(int *in, int *out, int insize, int outsize)
{
    int i = 0;
    int j = 0;
    Stack st;
    //如果指针无效或者长度不一样是无法判断的
    assert(in && out && insize == outsize);
    StackInit(&st);
    //将in数组中的元素压入栈中逐个比较,如果栈顶元素与out数组中的一致就弹出此元素
    while(i<insize)
    {
        StackPush(&st, in[i++]);
        if (StackTop(&st) == out[j]) {
            StackPop(&st);
            j++; //注意out数组中比较过的元素要跳过,所以下标要+1
        }
    }

    //此时栈中剩下的元素要与out数组中剩下的元素逐个比较,遇到不一样的就不匹配
    while (StackEmpty(&st) != 0)
    {
        if(StackTop(&st) != out[j++])
        {
            return 0;
        }
        StackPop(&st);
    }
    //此时为空栈,则说明匹配
    return 1;
}

int main(void)
{
    int in[5] = {1, 2, 3, 4, 5};
    int out[5] = {4, 5, 3, 2, 1 };
    int ret = IsLegal(in, out, 5, 5);
    if (ret == 1)
        printf("匹配\n");
    else
        printf("不匹配\n");

    system("pause");
    return 0;
}

测试用例

int in[5] = {1, 2, 3, 4, 5};
两组合法数据:
int out[5] = {4, 5, 3, 2, 1 };
int out[5] = {2, 3, 4, 5, 1 };
两组非法数据:
int out[5] = {4, 5, 3, 1, 2 };
int out[5] = {4, 3, 2, 5, 1 };

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81778489
今日推荐