美文网首页
逆波兰式

逆波兰式

作者: 六十年目裁判长亚玛萨那度 | 来源:发表于2019-01-13 15:16 被阅读0次

    实现目的:假设表达式由数字和双目四则运算符+,-,,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果。假设表达式由数字和双目四则运算符+,-,,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果。

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int getNum(char *str, int *ret) {//处理隐藏的最高结合权限:连续的数字
        int i = 0, num = 0;
        while (str[i] <= '9' && str[i] >= '0') {
            num = num * 10 + str[i++] - '0';
        }
        *ret = num;
        return i;
    }
    
    int getTerm(char *str, int *ret) {//处理乘除法
        int i = 0, temp;
        if (str[i] == 0) return 0;
        i += getNum(str + i, ret);
        if (str[i] == 0) return i;
    
        while (str[i]) {
            switch (str[i]) {
                case '*' : {
                    i += getNum(str + i + 1, &temp) + 1;
                    *ret *= temp;
                } break;
                case '/' : {
                    i += getNum(str + i + 1, &temp) + 1;
                    *ret /= temp;
                } break;
                default : return i;
            }
        }
        return i;
    }
    
    int calc(char *str) {//处理加减法
        int i = 0, a, b;
        char op;
        if (str[i] == 0) return 0;
        i += getTerm(str, &a);
        if (str[i] == 0) return a;
        while (str[i]) {
            op = str[i];
            i += getTerm(str + i + 1, &b) + 1;
            switch(op) {
                case '+' : a += b; break;
                case '-' : a -= b; break;
            }
        }
        return a;
    }
    
    int main() {
        char str[1000];
        scanf("%s", str);
        printf("%d\n",calc(str));
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:逆波兰式

          本文链接:https://www.haomeiwen.com/subject/intldqtx.html