逆波兰式

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

#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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 逆波兰式,是编程计算四则运算结果的算法。例子:平时写法a+b(中缀表达式),逆波兰式ab+。把中缀表达式编程后缀表...
    深耕项目管理阅读 683评论 0 1
  • 波兰式 又称为先序表达式,前缀表达式 逆波兰式 又称为后序表达式,后缀表达式
    reeuq阅读 2,147评论 0 0
  • 栈也是数据结构之一,栈是限定仅在表尾进行插入和删除的线性表。 允许插入和删除的一端我们称为栈顶(top)。另一端称...
    bryanrady_wang阅读 1,528评论 0 3
  • 前天 昨天 整个朋友圈都在晒十八岁。 我们究竟是从什么时候开始变老的? 是从杜拉斯说的十八岁,还是从开始回忆的时候...
    黎的C阅读 247评论 0 0
  • 1、敬酒服; 2、头饰、项链、等; 3、请帖(手写); 4、喜糖(及盒子); 5、伴手礼; 6、伴郎/伴娘礼服; ...
    蛇鬼阅读 236评论 0 0