在c ++中模拟确定性堆栈自动机(DAS)

时间:2011-07-13 18:07:40

标签: c++ finite-automata dsa

我正在阅读一个UVA练习,我需要模拟一个确定性的堆栈自动机,看看 如果DSA对给定条目接受某些字符串,则采用以下格式:

输入的第一行是整数C,表示测试用例的数量。每个测试用例的第一行包含五个整数E,T,F,S和C,其中E表示自动机中的状态数,T表示转换数,F表示最终状态数,S表示初始状态和C分别是测试字符串的数量。下一行将包含F整数,表示自动机的最终状态。然后得到T行,每行有2个整数I和J以及3个串L,T和A,其中I和J(0≤I,J

每个测试用例的第一行中的输出必须显示以下字符串“Case G:”,其中G表示测试用例的数量(从1开始)。如果自动机接受字符串,则打印单词“OK”的C行,否则打印“拒绝”。

例如:

Input:
2
3 5 1 0 5
2
0 0 1 Z XZ
0 0 1 X XX
0 1 0 X X
1 1 1 X £
1 2 £ Z Z
111101111
110111
011111
1010101
11011
4 6 1 0 5
3
1 2 b A £
0 0 a Z AZ
0 1 a A AAA
1 0 a A AA
2 3 £ Z Z
2 2 b A £
aabbb
aaaabbbbbb
c1bbb
abbb
aaaaaabbbbbbbbb

这是输出:

Output:
Case 1:
Accepted
Rejected
Rejected
Rejected
Accepted

Case 2:
Accepted
Accepted
Rejected
Rejected
Accepted   

我需要一些帮助,或者我知道如何模拟这个DSA,我不是问我一个能解决问题的代码,因为我想制作自己的代码(这个想法是为了正确学习?),但是我需要一些帮助(一些想法或伪代码)才能开始实施。

1 个答案:

答案 0 :(得分:2)

首先需要一个数据结构来保持转换。您可以使用带有包含转换五元组的转换结构的向量。但是你可以使用状态为整数的事实并创建一个保持在索引0的向量,从状态0转换;在索引1处从状态1过渡。这样,您可以缩短搜索时间,找到正确的转换。

您可以轻松地在stl库中使用堆栈作为堆栈。根据您的实现,您还需要搜索功能,如果使用第一种方法,您可以使用类似的功能:

int findIndex(vector<quintuple> v)//which finds the index of correct transition otherwise returns -1

然后使用返回值来获取newstate和newstack符号。

或者你可以在vector和bool标志上使用for循环,表示是否发现过渡。

在第二种方法中,您可以使用一个函数来引用新的状态和新的堆栈符号,并在找到适当的转换时设置它们。

对于输入,你可以使用像矢量或矢量这样的东西取决于个人品味。您可以使用for循环实现main方法,但如果您想要额外的困难,可以实现递归函数。可能很容易。