21xrx.com
2024-05-20 20:17:57 Monday
登录
文章检索 我的文章 写文章
C++无括号表达式求值代码
2023-07-04 21:49:14 深夜i     --     --
C++ 无括号表达式 求值 代码

在C++编程中,表达式求值是常见的需求,而无括号表达式求值则是其中的一种。C++无括号表达式求值利用了优先级和结合性的性质来实现自动识别运算优先级,从而减少代码中的冗余括号。下面是C++无括号表达式求值的代码实现:

#include

#include

using namespace std;

//计算两个数字的运算结果

double calculate(double num1, double num2, char op) {

  double result;

  switch(op) {

    case '+': result = num1 + num2; break;

    case '-': result = num1 - num2; break;

    case '*': result = num1 * num2; break;

    case '/': result = num1 / num2; break;

    default: result = 0;

  }

  return result;

}

double calculateExpression(string expression) {

  double numStack[100];//数字栈

  char opStack[100];//操作符栈

  int numTop = -1;//数字栈顶指针

  int opTop = -1;//操作符栈顶指针

  int len = expression.size();

  int i = 0;

  while(i < len) {

    if(expression[i] >= '0' && expression[i] <= '9') {//数字

      double num = 0;

      while(i < len && expression[i] >= '0' && expression[i] <= '9') {

        num = num * 10 + expression[i] - '0';

        i++;

      }

      numTop++;

      numStack[numTop] = num;

    } else {//操作符

      while(opTop >= 0 && ((expression[i] == '*' || expression[i] == '/') || (opStack[opTop] == '+' || opStack[opTop] == '-'))) {//比较运算符优先级

        double num1 = numStack[numTop];

        numTop--;

        double num2 = numStack[numTop];

        numTop--;

        char op = opStack[opTop];

        opTop--;

        double num = calculate(num2, num1, op);

        numTop++;

        numStack[numTop] = num;

      }

      opTop++;

      opStack[opTop] = expression[i];

      i++;

    }

  }

  while(opTop >= 0) {//计算剩余的运算

    double num1 = numStack[numTop];

    numTop--;

    double num2 = numStack[numTop];

    numTop--;

    char op = opStack[opTop];

    opTop--;

    double num = calculate(num2, num1, op);

    numTop++;

    numStack[numTop] = num;

  }

  return numStack[numTop];

}

int main() {

  string expression;

  cin >> expression;

  double result = calculateExpression(expression);

  cout << result << endl;

  return 0;

}

上述代码采用双栈(数字栈和操作符栈)实现了无括号表达式求值。该算法可以减少代码的复杂度和错误率,是一种不错的表达式求值方法,同时也是C++编程的常见技巧。

  
  

评论区

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