判断出入栈的合法性

问题:如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),判断是否合法

分析:用两个下标,[ii]标记所给的数组,[io]标记要判断的数组,当栈不为空并且栈顶元素和要判断的[io]所指向的数据一样时出栈,否则就入栈,当 ii<size 时,说明元素已经全部入栈,然后在看[io]和栈顶元素判断合法性

//要用到栈的操作
#include "Stack"

int IsValid(char in[], char out[], int size)
{
    int ii = 0;
    int io = 0;
    Stack stack;
    StackInit(&stack);
    
    while(ii < size)
    {
       if(in[ii] == out[io])
       {
           ii++;
           io++;
       }
       else
       {
           if (!StackEmpty(&stack) && StackTop(&stack) == out[io]) 
           {
				StackPop(&stack);
				io++;
			}
			else 
			{
				StackPush(&stack, in[ii]);
				ii++;
			}
       }
    }
    
    // 进的序列已经全部结束
	while (!StackEmpty(&stack))
	{
		if (StackTop(&stack) != out[io]) 
		{
			return 0;
		}

		StackPop(&stack);
		io++;
	}

	return 1;
}
  • 测试
#include <stdio.h>
#include <string.h>

void TestValid()
{
	char *in = "abcdefg";
	char *out1 = "decfbga";
	char *out2 = "fegdacb";
	char *out3 = "efdgbca";
	char *out4 = "cdbefag";

	printf("%s\n", IsValid(in, out1, strlen(in)) ? "合法" : "不合法"); //合法
	printf("%s\n", IsValid(in, out2, strlen(in)) ? "合法" : "不合法"); //不合法
	printf("%s\n", IsValid(in, out3, strlen(in)) ? "合法" : "不合法"); //不合法
	printf("%s\n", IsValid(in, out4, strlen(in)) ? "合法" : "不合法"); //合法
}

猜你喜欢

转载自blog.csdn.net/qq_40355351/article/details/82960631