21xrx.com
2025-03-27 17:27:20 Thursday
文章检索 我的文章 写文章
C++ 简单表达式计算代码
2023-07-10 13:36:15 深夜i     15     0
C++ 简单表达式 计算代码

在现代编程语言中,计算器是非常常见的一个功能,它可以用来计算简单的算数表达式。在这篇文章中,我们将介绍使用 C++ 编写一个简单的表达式计算器的代码。

首先,我们需要读取用户输入的表达式。我们可以使用 C++ 标准库中的 `getline` 函数来完成。该函数读取一行输入,并将其存储在一个字符串中。

接下来,我们需要将输入转换成可执行的代码。这可以通过将表达式拆分成一个个标记(token)来完成。标记可以是数字、运算符或括号。我们可以使用 C++ 的字符串处理函数来拆分字符串并将其转换为标记序列。

然后,我们需要考虑运算符的优先级。在本例中,我们只需要考虑加减乘除四个基本运算符,因此可以使用一个简单的算法来解决。我们可以定义一个栈来存储操作符,并按照优先级将操作符入栈或出栈。这样可以确保先执行高优先级的运算。

最后,我们需要计算表达式的值。可以使用逆波兰表达式(Reverse Polish Notation,RPN)来实现。逆波兰表达式是一种前缀表达式,其中每个操作符都放在其对应的操作数之前。我们可以使用一个栈来存储操作数和中间结果。遍历标记序列,遇到数字时将其压入栈中,遇到操作符时弹出栈顶的两个操作数,进行运算,并将结果压入栈中。

下面是 C++ 实现代码:

#include <iostream>
#include <string>
#include <stack>
#include <sstream>
using namespace std;
int priority(char op) {
  if (op == '+' || op == '-')
    return 1;
   else if (op == '*' || op == '/')
    return 2;
   else
    return 0;
  
}
double calculate(double a, double b, char op) {
  switch (op) {
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
    default: return 0;
  }
}
double evaluate(const string& expr) {
  stack<double> operands;
  stack<char> operators;
  istringstream iss(expr);
  string token;
  while (iss >> token) {
    if (isdigit(token[0])) {
      double operand = stod(token);
      operands.push(operand);
    } else {
      char op = token[0];
      while (!operators.empty() && priority(op) <= priority(operators.top())) {
        double b = operands.top(); operands.pop();
        double a = operands.top(); operands.pop();
        char op1 = operators.top(); operators.pop();
        double result = calculate(a, b, op1);
        operands.push(result);
      }
      operators.push(op);
    }
  }
  while (!operators.empty()) {
    double b = operands.top(); operands.pop();
    double a = operands.top(); operands.pop();
    char op = operators.top(); operators.pop();
    double result = calculate(a, b, op);
    operands.push(result);
  }
  return operands.top();
}
int main() {
  string expr;
  getline(cin, expr);
  double result = evaluate(expr);
  cout << result << endl;
  return 0;
}

上面的代码定义了两个栈:一个用于存储操作数和中间结果,另一个用于存储运算符。`priority` 函数用于判断运算符的优先级。`calculate` 函数用于计算两个操作数的结果。`evaluate` 函数遍历标记序列,并根据优先级进行运算,返回最终结果。`main` 函数读取用户输入的表达式,并输出计算结果。

使用上面的代码,我们可以计算简单的算数表达式。例如,输入 `3 + 4 * (2 - 1)`,输出 `7`。这个实现并不支持变量赋值、函数调用等高级功能,但对于一些简单的计算任务已经足够了。

  
  

评论区