【问题标题】:Trying to Validate Math Expression Recursively - What's wrong with this code?尝试递归验证数学表达式 - 这段代码有什么问题?
【发布时间】:2012-03-15 07:35:23
【问题描述】:

有效表达式 = 一位数

有效表达式 = (有效表达式 + 有效表达式)

这意味着我尝试创建的布尔函数将只接受以下类型的表达式作为有效表达式:

5
(5+3)
(6+(3+2))
((7+1)+(5+1))
............... etc.

我希望我的函数参数保持原样(istringstream& 是),并且我想在我的函数中使用 get(ch)。

我也想递归地做。但是,我做错了,它只验证类型的表达式:single digit

我的递归问题出在哪里?而且我知道它甚至不是一个适当的递归,我确信一个适当的递归甚至可以在更少的行中完成这项工作并且没有嵌套的 ifs..

感谢您提供任何有用的建议!

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>

using namespace std;

bool isvalid(istringstream& is)
{
    char ch;
    is.get(ch);
    if(ch-'0'>=0 || ch-'0'<=9) return true;
    if(ch=='(' && isvalid(is))
    {   
        is.get(ch);
        if(ch=='+' && isvalid(is))
        {
            is.get(ch);
            if(ch==')') return true;
        }
     }
     return false; 
}
bool empty(istringstream& is)
{
    char ch;
    is.get(ch);
    return is.fail(); 
}

int main() 
{    
    string s;    
    while(getline(cin,s))    
    {   
        istringstream is(s);
        cout<<(isvalid(is) && empty(is) ? "Expression OK" : "Not OK")<<endl;    
    } 
 }

【问题讨论】:

    标签: c++ function recursion boolean


    【解决方案1】:
    if(ch-'0'>=0 || ch-'0'<=9) return true;
    

    这需要一个 && 表达式,不是吗?

    【讨论】:

    • oops :) 但仍然......它不起作用,这个错误所做的是即使> 9 ..问题的数字必须在其他地方,它也会评估为真......
    • 问题解决了,我相信我有 3 个错误:这篇文章中提到的一个,另一个是我在嵌套 if 中省略的 get(ch),另一个是对函数的不必要调用在 if(")"..) 之后感谢所有提供帮助的人! :)
    【解决方案2】:

    想想字符串()。看起来像这样:

    isvalid("()"): ch = '(' 不在0-9之间,所以转到下一行 ch == '(',所以它计算 isValid(is)。

    second level: isvalid(")"): ch = ')',同样,不是 0-9,所以它转到下一行 ch != '(',因此它会缩短布尔表达式的评估并返回 false

    回到第一级:isvalid(is)失败,所以我们跳过if块,返回false

    【讨论】:

    • 你是对的,并且 () 是一个无效的表达式,所以这没有什么问题,问题是即使 (5+3) 或 (6+( 4+3)) 有效..
    • ...好点。所以试试(5+3)。在第二级,ch = '5' 并且我们返回 true,然后返回,抓取下一个字符,所以我们在 ch = '+' 的 if 块中,我们再次调用是有效的,它是三个所以我们继续, 并获取下一个字符,所以我们有“)”并且应该返回 true。所以我很难过。尝试在每一步输出“ch”的值——如果你没有调试器可以单步执行,这将有助于了解正在发生的事情。
    【解决方案3】:

    if(ch==')' &amp;&amp; isvalid(is)) return true;

    我认为您不需要 &amp;&amp; isvalid(is) 部分。它不符合你的语法

    【讨论】:

    • 我删除了它,但它仍然无法正常工作
    • 我已经很久没有用C++编程了,所以我不记得流方法的确切语义了。您确定您的空函数不是导致问题的函数吗? (可能是行尾字符或字符串结尾字符?)
    • 这就是我现在想知道的。我是否(在我的 isvalid 函数中)省略了 ch 是返回字符(ch=='\n')的情况?那是问题吗?但如果是这种情况,它甚至对单个数字表达式都不起作用,但它确实适用于那种......
    • 我认为你的 isvalid 函数应该没问题。问题可能出在您的 empty() 中。您能否暂时省略检查是否为空,仅检查 isvalid() 是否正常工作?
    • 检查yeahbro刚刚发布的答案:这也是一个很好的收获
    【解决方案4】:

    内部 if(ch==')' && ...) 将始终为假(因为 ch=='+' 如果你得到那个 if)- 缺少一个 get(ch)。

    【讨论】:

    • 完全正确,我在内部 if 中省略了“get(ch)”,但仍然无法正常工作......
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多