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
[解决办法]
#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)]");}