问题:如入栈的序列(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)) ? "合法" : "不合法"); //合法
}