我对c编程很新,我对括号匹配算法有疑问:
基本上,对于CS分配,我们必须执行以下操作:
我们需要提示用户输入1-20个字符的字符串。然后,我们需要报告是否有任何括号匹配。我们需要考虑以下类型的括号“{} []()”。
示例:
Matching Brackets
-----------------
Enter a string (1-20 characters): (abc[d)ef]gh
The brackets do not match.
另一个例子:
Enter a string (1-20 characters): ({[](){}[]})
The brackets match
其中一个要求是我们不使用任何堆栈数据结构,而是使用技术 下面:
我需要采取哪些算法步骤?我真的坚持这个。它不像计算括号那么简单,因为({)}的情况不起作用;括号计数匹配,但显然这是错误的。
任何有助于我朝着正确方向前进的帮助都将非常感激。
答案 0 :(得分:5)
你可以使用recursion(这基本上也可以模拟一个堆栈,这是对需要发生的事情的一般共识):
答案 1 :(得分:3)
您在此处描述Context-Free language,您需要验证某个单词是否在该语言中。
这意味着您可以创建一个描述此语言的Context Free Grammar。
对于这种特定语言,可以使用确定性 stack automaton 来验证某个单词是否在该语言中(对于每个上下文自由语言都不是这样,有些需要非语言确定性堆栈自动机)
请注意可以使用递归来模拟堆栈,并使用隐式调用堆栈。
其他替代方案(适用于所有无上下文的语言)是CYK Algorithm,但这里有点矫枉过正。
答案 2 :(得分:2)
所以你不允许使用堆栈..但你可以使用数组!这很好。
这可能违反规则,但您可以使用数组模仿堆栈。保留数组中“下一个开放点”的索引,并确保从该索引中执行所有插入/删除操作。
我的建议?解析字符串中的每个字符,并使用上面描述的“堆栈”来确定何时添加和删除括号/ parens / curlys。
答案 3 :(得分:2)
使用没有正则表达式/复杂语言的东西,这是最简单的方法。
您唯一需要的是一个最大长度为10的简单数组来模拟堆栈。您需要它来跟踪打开的最后一个括号类型。每次打开支架时,都会将支架类型“推”到阵列的末端。每次关闭括号时,只有当括号类型匹配时,才会“弹出”数组末尾的括号类型。
<强>算法:强>
迭代字符串中的每个字符。
遇到任何类型的开放式括号时,请将其附加到阵列中。如果您的阵列已满(即您已经存储了10个开放式支架类型),并且您无法附加它,您已经知道括号不匹配,您可以结束您的程序。
如果您遇到任何类型的闭括号,如果闭括号类型与数组的最后一个元素不匹配,您已经知道括号不匹配,您可以结束程序,打印它们不会匹配。否则,如果闭括号类型 匹配数组的最后一个元素,则将其“弹出”到数组的末尾。
最后,如果在迭代结束时数组为空,那么您就知道括号匹配。
编辑:在评论中我已经指出这是一个显式堆栈,并且递归可能是使用隐式堆栈的更好方法。
答案 4 :(得分:1)
正如你回答的那样,你肯定需要某种堆栈。这可以在数学上得到证实。但是,您可以通过使用编译器的堆栈机制来避免在代码中使用堆栈数据结构。这需要您使用recursive function calls。