酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

基于栈的中缀算术表达式求值 用c++语言 题目描述 本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。) 输入要求 多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只 有一个“=”时,输入结束。参加运算的数为double类型。 输出要求 对于每组数据输出1行,为表达式的运算结果。输出保留两位小数。 输入样例 2+2= 20*(4.5-3)=

为了实现基于栈的中缀算术表达式求值,我们需要处理运算符优先级和括号。以下是一个完整的C++程序,它读取多组中缀表达式并计算其结果: ```cpp #include <iostream> #include <stack> #include <sstream> #include <string> #include <cctype> #include <iomanip> using namespace std; // 判断字符是否为操作符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取操作符的优先级 int getPrecedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return 0; } // 执行简单的二元运算 double applyOp(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } return 0; } // 计算中缀表达式的值 double evaluateExpression(const string& expression) { stack<double> values; // 存储操作数 stack<char> ops; // 存储操作符 for (size_t i = 0; i < expression.length(); i++) { // 跳过空格 if (isspace(expression[i])) continue; // 如果当前字符是数字或小数点,则解析整个数字 if (isdigit(expression[i]) || expression[i] == '.') { stringstream ss; while (i < expression.length() && (isdigit(expression[i]) || expression[i] == '.')) { ss << expression[i++]; } double val; ss >> val; values.push(val); i--; // 因为for循环会再次增加i,所以这里需要减1 } // 如果是左括号,直接压入操作符栈 else if (expression[i] == '(') { ops.push(expression[i]); } // 如果是右括号,则弹出操作符直到遇到左括号 else if (expression[i] == ')') { while (!ops.empty() && ops.top() != '(') { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } ops.pop(); // 弹出左括号 } // 如果是操作符 else if (isOperator(expression[i])) { while (!ops.empty() && getPrecedence(ops.top()) >= getPrecedence(expression[i])) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } ops.push(expression[i]); } } // 最后处理剩余的操作符 while (!ops.empty()) { double val2 = values.top(); values.pop(); double val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } return values.top(); } int main() { string line; while (getline(cin, line)) { if (line == "=") break; // 输入结束条件 if (line.back() == '=') line.pop_back(); // 去掉等号 double result = evaluateExpression(line); cout << fixed << setprecision(2) << result << endl; } return 0; } ``` 代码说明: 1. isOperator: 判断一个字符是否是操作符。 2. getPrecedence: 返回操作符的优先级。 3. applyOp: 根据操作符对两个操作数进行计算。 4. evaluateExpression: 使用两个栈分别存储操作数和操作符,遍历表达式并根据操作符的优先级进行计算。 5. main: 读取输入,调用`evaluateExpression`函数计算结果并输出。 这个程序能够正确处理包含括号和不同优先级操作符的中缀表达式,并且保留两位小数输出结果。 [2024-10-26 20:11:07 | AI写代码神器 | 1132点数解答]

相关提问