Fork me on GitHub

判断元素出栈入栈合法性

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

一般来说,这种判断性的问题会出现在一些面试题目的选择题中,当然学习了栈之后,我们就要有解决这种问题的能力。
思路: 判断元素是否相同,相同就进行下一个元素比较,当栈不为空并且栈顶元素和输出的栈元素相同,则将该元素出栈并指向输出元素的下一个,否则就将该元素进栈,并指向比较的元素的下一个 ,直到所有元素比较完
然后按出栈顺序进行比较,当栈不为空时,将栈顶元素与当前元素进行比较,不相同直接返回,则判断出栈元素不合法,否则将该元素出栈,并指向下一个元素;

创建一个Valid.h的文件,在这里我们引入了stack.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once

#include "Stack.h"
#include <string.h>

int Valid(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])
{
StackPop(&stack);
io++;
}
else
return 0;
}
return 1;
}

接下来我们进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
void TestValid()
{
char *in = "abcdefg";
char *out1 = "decfbga";
char *out2 = "fegdacb";
char *out3 = "efdgbca";
char *out4 = "cdbefag";

printf("%s\n",Valid(in,out1,strlen(in)) ? "合法顺序":"非法顺序" );
printf("%s\n",Valid(in,out2,strlen(in)) ? "合法顺序":"非法顺序" );
printf("%s\n",Valid(in,out3,strlen(in)) ? "合法顺序":"非法顺序" );
printf("%s\n",Valid(in,out4,strlen(in)) ? "合法顺序":"非法顺序" );
}

1
2
3
4
5
输出结果:
合法顺序
非法顺序
非法顺序
合法顺序

本文标题:判断元素出栈入栈合法性

文章作者:LiuXiaoKun

发布时间:2018年08月23日 - 16:08

最后更新:2018年09月19日 - 08:09

原始链接:https://LiuZiQiao.github.io/2018/08/23/判断元素出栈入栈合法性/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%