首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C/C++的题目:算术表达式求值,该怎么解决

2012-03-09 
C/C++的题目:算术表达式求值小米终于快小学毕业了,小米的小学毕业论文是解不含未知数的算术表达式。老师给

C/C++的题目:算术表达式求值
小米终于快小学毕业了,小米的小学毕业论文是解不含未知数的算术表达式。 
老师给他的样例非常多,而且式子很长,老师还给小米 4 个规则: 
1.a+b 代表a+2*b; 
2.a-b 代表 a-3*b; 
3.全部运算满足右结合性,如:a+b+c=a+2*(b+2*c); 
4.小括号的优先级大于中括号。 
小米不想把时间浪费在单调而又无趣的计算上,所以他请你帮他写一个程序,他的要
求很简单,就是他输入一组数据,就能立刻得到答案。 
现给你一个算术表达式,对于每个式子输出一个数,表示该表达式的解。 
★数据输入 
输入只有一行,给你一个算术表达式,式子中只含有数字,‘+’、‘-’、‘(’、‘)’、‘[’、‘]’,长度不超过 10000,式子中的数均不为负,保证数据合法,输入的值以及结果都为 int型整数。 
★数据输出 
输出式子的运算结果! 
 
输入示例 输出示例 
(34+28+28)+[(7+8)-(9+10)] 74 
 

[解决办法]

探讨
我还真想拒绝。。。但是这算平时成绩啊啊啊啊!大家都6分我就1分,那就亏打了。。。

[解决办法]
其实这个问题没有那么复杂,将它抽象一下,其实就是求:
left + right
而且题目说明了不用考虑异常输入,所以就可以变得简单得多:
C/C++ code
#include <iostream>#include <string>#include <locale>#include <sstream>class RightExpressionEvaluator {public:    explicit RightExpressionEvaluator(std::istream& input) : input(input) {    }    int evaluate() {        return evaluateLeftOperand() + evaluateRightOperand();    }private:    int evaluateLeftOperand() {        return readNextToken() ? parseLeftOperand() : 0;    }    int parseLeftOperand() {        if (isOpenBracket(token)) {            return evaluate();        }        else if (isDigit(token)) {            return readNextInteger();        }        return 0;    }    int evaluateRightOperand() {        return readNextToken() ? parseRightOperand() : 0;    }    int parseRightOperand() {        switch (token) {            case '+': return 2 * evaluate();            case '-': return -3 * evaluate();        }        return 0;    }    int readNextInteger() {        int result = 0;        input.unget();        input >> result;        return result;    }        bool readNextToken() {        return input.get(token).good();    }    bool isOpenBracket(char token) {        return token == '(' || token == '[';    }    bool isDigit(char token) {        return std::isdigit(token, std::locale());    }private:    std::istream& input;    char token;};void testEvaluator(const std::string& expression) {    std::istringstream input(expression);    std::cout << "expression: " << expression << std::endl;    std::cout << "value     : " << RightExpressionEvaluator(input).evaluate() << std::endl;    std::cout << std::endl;}int main() {    testEvaluator("2");    testEvaluator("2+2");    testEvaluator("2-2");    testEvaluator("2-(2+2)");    testEvaluator("2-[2+2]");    testEvaluator("(2-2)+(2+2)");    testEvaluator("[2-2]-(2+2)");    testEvaluator("(34+28+28)+[(7+8)-(9+10)]");} 

热点排行