已知char str = "3+9/(2+1)";怎么输出结果为6

告诉了一只的字符串char型str = "3+9/(2+1)",怎么int整形十进制输出结果为6?
我有更好的答案
邀请更新
2013-11-28 最佳答案
#include <stdio.h>

bool parseKakko(const char* &p, int &x);

bool parseNumber(const char* &p, int &x) {
    if (parseKakko(p, x)) return true;
    
    const char* lp = p;
    if (*lp == '-') {
        ++lp;
        if (parseNumber(lp, x)) {
            x = -x;
            p = lp;
            return true;
        }
    }
    
    if (*lp >= '0' && *lp <= '9') {
        int val = 0;
        while(*lp >= '0' && *lp <= '9') {
            val = val * 10 + (*lp - '0');
            ++lp;
        }
        p = lp;
        x = val;
        return true;
    } else {
        return false;
    }
}

bool parseOP1(const char* &p, char &x) {
    if (*p == '*' || *p == '/') {
        x = *p;
        ++p;
        return true;
    } else
        return false;
}

bool parseOP2(const char* &p, char &x) {
    if (*p == '+' || *p == '-') {
        x = *p;
        ++p;
        return true;
    } else
        return false;
}

bool parseFactor(const char* &p, int &x) {
    int lhs, rhs;
    char op;
    const char* lp = p;
    if ( parseNumber(lp, lhs) ) {
        const char* lp2 = lp;
        while (parseOP1(lp2, op) ) {
            if (parseNumber(lp2, rhs)) {
                if (op == '*') lhs *= rhs;
                if (op == '/') lhs /= rhs;
                lp = lp2;
            } else break;
        }
        p = lp;
        x = lhs;
        return true;
    } else return false;
}

bool parseExpr(const char* &p, int &x) {
    int lhs, rhs;
    char op;
    const char* lp = p;
    
    if (parseFactor(lp, lhs)) {
        const char* lp2 = lp;
        while (parseOP2(lp2, op)) {
            if (parseFactor(lp2, rhs)) {
                if (op == '+') lhs += rhs;
                if (op == '-') lhs -= rhs;
                lp = lp2;
            } else break;
        }
        p = lp;
        x = lhs;
        return true;
    } else return false;
}

bool parseKakko(const char* &p, int &x) {
    const char* lp = p;
    if (*lp == '(') {
        ++lp;
        if (parseExpr(lp, x)) {
            if (*lp == ')') {
                ++lp;
                p = lp;
                return true;
            } else return false;
        } else return false;
    } else return false;
}

#include <stdio.h>

int main()
{
    int val;
    char str[] = "3+9/(2+1)";
    const char* pstr = str;
    if (parseExpr(pstr, val)) {
        printf("%d\n", val);
    }
    return 0;
}

我够意思了不?w


改了一下,支持负号

追问
  十分感谢,不够编译好像有问题
错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parseKakko’
 
追答
提示第几行错误来着?
另外这是C++不是C
追问
3Q,您从事这方面多久了,大神啊!

空雪梦见

采纳率:78% 来自团队:快乐之家 擅长: C/C++ C#/.NET VC++

其他回答

仰望楼上雷喵大大
这种题前提知识是栈,你可以看看逆波兰表示法,将输如的字符串转化成逆波兰表示发再配合栈再计算就行了。
酿泉_ | 发布于2013-11-28
评论
6应该是作为一个字符来输出的~
austin0918 | 发布于2013-11-28
评论

为您推荐:

×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消