21xrx.com
2024-11-05 18:36:11 Tuesday
登录
文章检索 我的文章 写文章
C++实现计算表达式值的函数
2023-07-05 08:08:59 深夜i     --     --
C++ 计算表达式 函数 基本算法 运算符优先级

C++是一种高效、可靠的编程语言,广泛应用于计算机程序的编写。在编写程序的过程中,我们有时需要实现计算表达式值的函数,这就需要用到C++中的一些运算符和函数库。

计算表达式值的函数可以用来计算简单或复杂的数学表达式,例如加、减、乘、除、取模和求幂等运算。在实现这个函数的过程中,我们需要先将表达式转化为逆波兰式,再调用栈来计算表达式的值。

具体方法如下:

1.使用字符串来表示表达式,将表达式存入字符串中。

2.使用栈来储存运算符,遇到操作数时直接入栈。

3.遇到运算符时,则将栈顶的操作数弹出,进行运算,将结果再入栈。

4.重复执行步骤3,直到表达式处理完毕,此时栈顶的元素即为表达式的值。

下面是一个简单的示例代码,在这个代码中,我们通过分别声明两个栈来储存操作数和运算符,然后通过循环按照上述方法进行计算,得出表达式的值。


double calcExpressionValue(const std::string& exp) {

  std::stack<double> num_stack;

  std::stack<char> op_stack;

  for (size_t i = 0; i < exp.length(); i++) {

    if (isspace(exp[i])) continue;

    if (isdigit(exp[i])) {

      int j = i; double num = 0;

      while (j < exp.length() && (isdigit(exp[j]) || exp[j] == '.')) {

        num = num * 10 + (exp[j] - '0');

        j++;

      }

      i = j - 1;

      num_stack.push(num);

      continue;

    }

    if (exp[i] == '(') {

      op_stack.push('(');

    } else if (exp[i] == ')') {

      while (op_stack.top() != '(') {

        double b = num_stack.top(); num_stack.pop();

        double a = num_stack.top(); num_stack.pop();

        char op = op_stack.top(); op_stack.pop();

        num_stack.push(calc(a, b, op));

      }

      op_stack.pop();

    } else {

      while (!op_stack.empty() && op_stack.top() != '(' &&

          (getPriority(op_stack.top()) >= getPriority(exp[i]))) {

        double b = num_stack.top(); num_stack.pop();

        double a = num_stack.top(); num_stack.pop();

        char op = op_stack.top(); op_stack.pop();

        num_stack.push(calc(a, b, op));

      }

      op_stack.push(exp[i]);

    }

  }

  while (!op_stack.empty()) {

    double b = num_stack.top(); num_stack.pop();

    double a = num_stack.top(); num_stack.pop();

    char op = op_stack.top(); op_stack.pop();

    num_stack.push(calc(a, b, op));

  }

  return num_stack.top();

}

需要说明的是,这个函数可以通过定义一个计算函数`calc`来实现加、减、乘、除、取模和求幂等运算。例如:


double calc(double a, double b, char op) {

  switch(op) {

    case '+': return a + b;

    case '-': return a - b;

    case '*': return a * b;

    case '/': return a / b;

    case '%': return ((long long)a) % (long long)b;

    case '^': return std::pow(a, b);

  }

  return 0;

}

综上所述,使用C++实现计算表达式值的函数可以通过栈的帮助实现,这样可以避免复杂的数学计算过程,提供了一种方便快捷的数学计算方法,为我们生活和工作带来了便利。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复