表达式转换
中->后
- 初始化一个空栈,用于存储运算符。
- 逐个扫描中缀表达式的字符:
- 如果是操作数,直接加入后缀表达式。
- 如果是左括号 (,将其压入栈。
- 如果是右括号 ),不断弹出栈顶元素并加入后缀表达式。
- 如果是操作符:
- 如果栈为空或者栈顶为左括号,直接压入栈。
- 否则,比较栈顶操作符和当前操作符的优先级:
- 若当前操作符优先级较高,直接压入栈。
- 若当前操作符优先级较低或相等,弹出栈顶元素并加入后缀表达式。
 重复执行直到可以压入栈中。
 
 
 
- 扫描完毕后,将栈中剩余的元素依次加入后缀表达式。
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\)。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号