找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 303|回复: 2

逆波兰表达式

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-6-12 21:57:11 | 显示全部楼层 |阅读模式



    正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便。
    例如:3 + 5 * (2 + 6) - 1
    而且,常常需要用括号来改变运算次序。
    相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为:
    - + 3 * 5 + 2 6 1
    不再需要括号,机器可以用递归的方法很方便地求解。
    为了简便,我们假设:
    1. 只有 + - * 三种运算符
    2. 每个运算数都是一个小于10的非负整数
   
    下面的程序对一个逆波兰表示串进行求值。
    其返回值为一个结构:其中第一元素表示求值结果,第二个元素表示它已解析的字符数。
struct EV
{
    int result;  //计算结果
    int n;       //消耗掉的字符数
};

struct EV evaluate(char* x)
{
    struct EV ev = {0,0};
    struct EV v1;
    struct EV v2;

    if(*x==0) return ev;
   
    if(x[0]>=&#39;0&#39; && x[0]<=&#39;9&#39;){
        ev.result = x[0]-&#39;0&#39;;
        ev.n = 1;
        return ev;
    }
   
    v1 = evaluate(x+1);
    v2 = _____________________________;  //填空位置
   
    if(x[0]==&#39;+&#39;) ev.result = v1.result + v2.result;
    if(x[0]==&#39;*&#39;) ev.result = v1.result * v2.result;
    if(x[0]==&#39;-&#39;) ev.result = v1.result - v2.result;
    ev.n = 1+v1.n+v2.n;

    return ev;
}

当然,你也可以自己写程序来实现。


1793

主题

457

回帖

0

积分

管理员

积分
0
发表于 2013-6-13 04:56:11 | 显示全部楼层
- + 3 * 5 + 2 6 1
这个计算结果是多少啊

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-6-14 21:47:08 | 显示全部楼层
evaluate(x+1+v1.n)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 16:33 , Processed in 0.110142 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表