读书人

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

发布时间: 2012-03-09 16:54:57 作者: rapoo

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)]");} 

读书人网 >C++

热点推荐