《数据结构》中表达式求值的经典算法是用两个栈,一个存数字,一个存运算符。依次读入表达式中的每个字符,若是数字则进数字栈,若是运算符则和运算符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕。运算符的优先级表如下
| + | - | * | / | ( | ) | # | |
| + | > | > | < | < | < | > | > |
| - | > | > | < | < | < | > | > |
| * | > | > | > | > | < | > | > |
| / | > | > | > | > | < | > | > |
| ( | < | < | < | < | < | = | |
| ) | > | > | > | > | > | > | |
| # | < | < | < | < | < |
= |
学了编译原理后,发现可以用递归下降分析来求表达式的值。表达式的文法如下
<Expr> -> <Term> { (+|-) <Term> }
<Term> -> <Factor> { (*|/) <Factor> }
<Factor> -> (<Expr>) | num
按照递归下降分析的技巧,每一个非终结符写一个函数
#pragma once #include<string> using namespace std; /************************************************************************/ /* 文法如下 <Expr> -> <Term> { (+|-) <Term> } <Term> -> <Factor> { (*|/) <Factor> } <Factor> -> (<Expr>) | num /************************************************************************/ class Calculator { public: Calculator(string &str); ~Calculator(); double calculate() { return ans; } double ans; //表达式的值 private: int cur; //目前的位置 string str; double expression(); double term(); double factor(); };