急,这道题怎么编程呀,用C语描述,请前辈们帮忙了

来源:百度知道 编辑:UC知道 时间:2024/05/21 08:29:35
逆波兰表达式的求值,题目要求:
给出一个用字符串形式表示的正确的算术表达式,首先
将其转换为逆波兰表达式,之后再对该逆波兰表达式求值。
表达式含有“+-*/()”几种运算,且运算数均为一位正整数,除法是整除。

用C++ 来实现,采用运算符重载的方式可以方便求出

class CSAI
{
// ...
public:
CSAI operator +(int n) {/*...*/}
// ...
};
然后你定义了一个CSAI对象c,一个int变量n:
CSAI c;
int n = 10;
你会发现,c+n可以正确运行,而n+c将导致编译错误。原因嘛,上面已经说过了,在成员函数中,被省略的实例对象这个参数是第一个参数,而在n+c操作中,第一个参数是int型,第二个才是CSAI对象,不出错才叫诡异。
为了解决这种问题,可行的办法就是将运算符重载为全局函数,而加号这类运算符需要重载两次:
CSAI operator +(CSAI &c, int n) {/* ... */}
CSAI operator +(int n, CSAI &c) {/* ... */}

顺带罗嗦一句,通常运算符重载我差不多都写成这样:
const CSAI operator +(const CSAI &c, int n) {/* ... */}
返回类型前的const是为了保持运算符的操作一致性。比如说下面的代码:
int a=10, b=5;
a+b = 20;
这肯定会编译报错。但是,如果返回类型前没有const,那么:
CSAI c1, c2;
int n = 5;
c1+n = c2;
这种代码就可以顺利通过编译,可能连警告都没有。这样的话,你定义的加号操作跟内部规则就有了出入。因此推荐做法是加上const。