题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

#include <stdio.h>
#include <string.h>
int main() {
    int map[127] = { 0 };
    map['+'] = 1;
    map['-'] = 1;
    map['*'] = 2;
    map['/'] = 2;
    char str[101] = { 0 };
    int a1[101] = { 0 };
    char a2[101] = { 0 };
    scanf("%s", str);
    int len = strlen(str);
    char str2[201] = { 0 };
    int c = 0;
    int i = 0;
    int j = 0;
    strcpy(&str2[1], str);
    str2[0] = '(';
    str2[len+1] = ')';
    for (int k = 0; k < len + 2; k++)
    {
        if (str2[k] == '-' && str2[k - 1] == '(')
        {
            memmove(&str2[k + 1], &str2[k], len + 2 - k);
            len++;
            str2[k] = '0';
        }
    }
    while (c < len + 2)
    {
        if (str2[c] >= '0' && str2[c] <= '9')
        {
            int n = 0;
            char std[12] = { 0 };
            int m = 0;
            while (str2[c] >='0'&&str2[c]<='9')
            {
                std[m++] = str2[c++];
            }
            int lenc = m - 1;
            for (m = 0; m <=lenc; m++)
            {
                n = n * 10 + (std[m] - '0');
            }
            a1[i++] = n;
        }
        else if (map[str2[c]] > map[a2[j-1]] && str2[c] != '(')
        {
            a2[j++] = str2[c++];
        }
        else if (map[str2[c]] <= map[a2[j-1]] && str2[c] != '(' && str2[c] != ')')
        {
            int n = 0;
            if (a2[j - 1] == '+')
                n = a1[i - 2] + a1[i - 1];
            if (a2[j - 1] == '-')
                n = a1[i - 2] - a1[i - 1];
            if (a2[j - 1] == '*')
                n = a1[i - 2] * a1[i - 1];
            if (a2[j - 1] == '/')
                n = a1[i - 2] / a1[i - 1];
            a1[i - 2] = n;
            a1[i - 1] = 0;
            a2[j - 1] = 0;
            j = j - 1;
            i = i - 1;
        }
        else if (str2[c] == '(')
        {
            a2[j++] = str2[c++];
        }
        else {
            if (str2[c] == ')' && a2[j - 1] == '(')
            {
                a2[j - 1] = 0;
                j = j - 1;
                c++;
            }
            else {
                int n = 0;
                if (a2[j - 1] == '+')
                    n = a1[i - 2] + a1[i - 1];
                if (a2[j - 1] == '-')
                    n = a1[i - 2] - a1[i - 1];
                if (a2[j - 1] == '*')
                    n = a1[i - 2] * a1[i - 1];
                if (a2[j - 1] == '/')
                    n = a1[i - 2] / a1[i - 1];
                a1[i - 2] = n;
                a1[i - 1] = 0;
                a2[j - 1] = 0;
                j = j - 1;
                i = i - 1;
            }
        }
    }
    printf("%d\n", a1[0]);
    return 0;
}

全部评论

相关推荐

07-02 13:52
武汉大学 golang
骗你的不露头也秒
牛客87776816...:😃查看图片
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
zhch7:建议9✌️把学历加黑加粗,如果实在offer可能是觉得佬不会去
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务