表达式转换

中->后

  1. 初始化一个空栈,用于存储运算符。
  2. 逐个扫描中缀表达式的字符:
    • 如果是操作数,直接加入后缀表达式。
    • 如果是左括号 (,将其压入栈。
    • 如果是右括号 ),不断弹出栈顶元素并加入后缀表达式。
    • 如果是操作符
      • 如果栈为或者栈顶为左括号,直接压入栈。
      • 否则,比较栈顶操作符和当前操作符的优先级:
        • 若当前操作符优先级较高,直接压入栈。
        • 若当前操作符优先级较低或相等,弹出栈顶元素并加入后缀表达式。
          重复执行直到可以压入栈中。
  3. 扫描完毕后,将栈中剩余的元素依次加入后缀表达式。
std::string change(const std::string &str) { // 中缀表达式->后缀表达式
  std::vector<char> op;
  std::string res;

  for (auto ch : str) {
    if (isdigit(ch)) { // 数字,直接加入
      res.push_back(ch);
    } else if (ch == '(') {
      op.push_back(ch);
    } else if (ch == ')') { // 右括号,弹出符号直至左括号
      while (op.back() != '(') res.push_back(op.back()), op.pop_back();
      op.pop_back(); // 弹出左括号
    } else {
      if (op.empty() || op.back() == '(') op.push_back(ch);
      else {
        while (!op.empty() && impt(ch) <= impt(op.back()))
          res.push_back(op.back()), op.pop_back();
        op.push_back(ch);
      }
    }
  }

  while (!op.empty()) res.push_back(op.back()), op.pop_back();
  
  return res;
}

其中 impt 为返回一个操作符的重要性的函数,如果是左括号则返回 \(-\infty\)

posted @ 2025-01-19 11:20  OIer_wst  阅读(9)  评论(0)    收藏  举报