使用c++设计一个简单的计算器,它支持不带括号的四则运算,计算器要满足先乘除后加减的规则
#include <iostream>
#include <string>
#include <vector>
#include <sstream>// 定义运算符的优先级
int precedence(char op) {if (op == '*' || op == '/')return 2;if (op == '+' || op == '-')return 1;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 calculate(std::string expression) {std::vector<double> values;std::vector<char> ops;std::stringstream ss(expression);std::string token;while (ss >> token) {if (token == "+" || token == "-" || token == "*" || token == "/") {// 处理运算符while (!ops.empty() && precedence(ops.back()) >= precedence(token[0])) {double b = values.back(); values.pop_back();double a = values.back(); values.pop_back();char op = ops.back(); ops.pop_back();values.push_back(applyOp(a, b, op));}ops.push_back(token[0]);} else {// 处理数字values.push_back(std::stod(token));}}// 处理剩余的运算while (!ops.empty()) {double b = values.back(); values.pop_back();double a = values.back(); values.pop_back();char op = ops.back(); ops.pop_back();values.push_back(applyOp(a, b, op));}return values.back();
}int main() {std::string expression;std::cout << "请输入一个算术表达式(数字和运算符之间用空格分隔):" << std::endl;std::getline(std::cin, expression);double result = calculate(expression);std::cout << "计算结果:" << result << std::endl;return 0;
}
这个程序的工作原理如下:
precedence
函数定义了运算符的优先级,乘除的优先级高于加减。applyOp
函数执行基本的算术运算。calculate
函数是主要的计算函数:- 它使用两个向量:一个存储数值,另一个存储运算符。
- 它遍历输入的表达式,对于每个标记(数字或运算符):
- 如果是运算符,它会检查优先级。如果栈顶的运算符优先级更高或相等,就先计算栈顶的运算。
- 如果是数字,直接压入数值栈。
- 最后,它处理剩余的运算。
- 在
main
函数中,我们从用户那里获取输入的表达式,然后调用calculate
函数进行计算。
这个计算器能够正确处理不带括号的四则运算,并且遵循先乘除后加减的规则。例如: