所以我需要一个递归函数,当它找到一对匹配的括号时返回true。我设法做的是下面。找到第一个支架时,从外部调用功能。它适用于像(TEXT)这样的简单示例,但我需要修改它以便它可以使用嵌套大括号。像(T(E)XT)那样的东西。我只是无法弄清楚如何做到这一点。我首先对递归不太满意。我不能使用堆栈或队列或类似的东西。你能帮助我吗,最聪明的stackowerflow吗?
bool Round(ifstream &infile, char s)
{
bool ret;
if (s==')')
{
cout<<s;
return true;
}
if (s=='(')
{
//I DON'T KNOW WHAT SHOULD HAPPEN HERE
}
else
{
cout<<s;
infile>>s;
ret=Round(infile,s);
}
return ret;
}
答案 0 :(得分:1)
递归下降解析的想法是,您将责任委托给每个都知道如何解析其语法部分的函数,并且它们可以嵌套(即相互调用或自称)。
在扫描的任何时候,如果流中的下一个字符是状态(N)的FIRST
字符,那么预测状态(N),那么必须你做?匹配状态(N)(解析或消费)。
不确定为什么你调用你的函数Round(),我称之为match_block()
在该状态的匹配函数中,扫描字符,查找该状态的REST
,但也递归扫描任何其他合法嵌套状态的FIRST
字符。在您的情况下,它很简单,您可以期望空格,(
或)
所以嵌套点是FIRST(block)
== (
和REST(block)
== )
,但如果我们在块中找到(
,那么预测另一个,所以再次匹配。
如果不为您编写,我认为您理解递归就像:
void foo() {
foo();
}
显然你不希望这样,它的无限递归。但那是递归部分。逻辑是你已经知道的部分(如何匹配“括号”)
答案 1 :(得分:0)
为了简单起见,我建议解决 only 包含括号的输入问题。在伪代码中,解决方案看起来像这样:
如果我看到一个开放的paren 消耗它并递归匹配parens 如果我看到一个亲密的人 返回true 其他 返回错误
请注意,此解决方案首先匹配打开括号,然后然后查找匹配的右括号。将其与您编写的代码进行对比。我认为这是你挣扎的原因之一。
现在,如果您可以对此进行编码并使其仅适用于包含括号的输出,请参阅使用其他字符可以执行的操作。同样,你想要保持简单。例如,尝试使用输入字符'(',')'和''来解决问题。假设这些是唯一输入字符并相应地进行测试。
当你可以使用空格和括号时,它应该是一个简单的步骤,最终允许任何文本。