题解 | #表达式求值#C语言实现

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

解题思路:1.将普通表达式转化为逆波兰表达式。2.计算逆波兰表达式的值。

1.将普通表达式转化为逆波兰表达式:使用字符串存储操作符、数值,形成字符串数组存储逆波兰表达式。从左到右遍历输入的字符串,如果是数字,直接存入字符串数组;如果是*,直接入栈;如果是(也直接入栈;如果是+或-,判断栈顶元素,如果不是(,则栈顶元素出栈,当前符号入栈;如果是),出栈直至遇到(。若遍历结束,栈不为空,则逐个出栈。

2.计算逆波兰表达式的值:以字符串数组作为输入,逐个读取,计算逆波兰表达式的值。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
#include <stdio.h>
int solve(char* s ) {
    //二维数组存储逆波兰表达式
    char exp[100][10] = {0};
    int exp_p = 0;

    //栈
    char op[100];
    int op_top = 0;

    //转换逆波兰表达式
    int i = 0;
    while (s[i] != '\0') {
        if (s[i] == '*') {//高优先级,直接入栈
            op[op_top++] = s[i];
        } else if (s[i] == '+' || s[i] == '-') { //低优先级判断
            if (op_top > 0) {//栈不为空,则检查栈顶符号
                if (op[op_top - 1] !=
                        '(') {//若优先级不大于栈顶符号,则出栈并替换
                    sprintf(exp[exp_p], "%c", op[op_top - 1]);
                    exp_p++;
                    op[op_top - 1] = s[i];
                } else {//否则入栈
                    op[op_top++] = s[i];
                }
            } else {//栈空,直接入栈
                op[op_top++] = s[i];
            }
        } else if (s[i] == '(') { //(直接入栈
            op[op_top++] = s[i];
        } else if (s[i] == ')') { //)出栈,直到遇见)
            if (op_top > 0) { //判断栈是否为空
                while (op[op_top - 1] != '(') { //循环出栈
                    sprintf(exp[exp_p], "%c", op[op_top - 1]);
                    exp_p++;
                    op_top--;
                }
                op_top--;//(出栈
            }
        } else {//如果是数值
            int j = 0;
            while (s[i] >= '0' && s[i] <= '9') { //循环读入数值
                exp[exp_p][j++] = s[i++];
            }
            exp[exp_p][j] = '\0';
            exp_p++;
            continue;
        }
        i++;
    }

    while (op_top > 0) { //如果栈不为空,全部出栈
        sprintf(exp[exp_p], "%c", op[op_top - 1]);
        exp_p++;
        op_top--;
    }

    for (int i=0; i<exp_p; i++) {
        printf("%s\n",exp[i]);
    }

    //逆波兰表达式结果计算
    int num[100], num_top = 0;
    for (int i = 0; i < exp_p; i++) {
        if (strcmp(exp[i], "+") == 0) {
            num[num_top - 2] += num[num_top - 1];
            num_top--;
        }
        else if (strcmp(exp[i], "-") == 0) {
            num[num_top - 2] -= num[num_top - 1];
            num_top--;
        }
        else if (strcmp(exp[i], "*") == 0) {
            num[num_top - 2] *= num[num_top - 1];
            num_top--;
        }else {
            sscanf(exp[i], "%d",&num[num_top]);
            num_top++;
        }
    }

    return num[0];
}

全部评论

相关推荐

点赞 评论 收藏
分享
Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务