#include<iostream> #include<stack> #include <string> #include <vector> //判断 new_op > old_op bool CompareOp(const std::string& new_op, const std::string& old_op) { if (new_op == "+" || new_op == "-") { if (old_op == "+" || old_op == "-" || old_op == "/" || old_op == "*") { return false; } else { return true; } } else { if (old_op == "/" || old_op == "*") { return false; } else { return true; } } } //中缀转后缀 std::vector<std::string> InfixToPostfix(const std::vector<std::string>& infix_list) { std::vector<std::string> result; std::stack<std::string> operator_stack; for (const auto& input : infix_list) { if (input == "+" || input == "-" || input == "*" || input == "/") { while (true) { if (operator_stack.empty()) { operator_stack.push(input); break; } else { //比较当前运算符和栈顶的运算符的优先级,栈顶优先级大于等于当前的运算符时,写入结果中 const auto& top_operator = operator_stack.top(); if (CompareOp(input, top_operator)) { operator_stack.push(input); break; } else { result.push_back(top_operator); operator_stack.pop(); } } } } else { //数字直接写入结果中 result.push_back(input); } } while (!operator_stack.empty()) { result.push_back(operator_stack.top()); operator_stack.pop(); } return std::move(result); } //计算后缀表达式的结果 float CalcPostFix(std::vector<std::string> infix_list) { std::stack<float> number_stack; for (auto input : infix_list) { if (input == "+" || input == "-" || input == "*" || input == "/") { //遇到运算符, 弹出栈顶的两个数字进行计算,并把计算结果入栈 //注意顺序,先弹出的应该是是右边的数字 auto num2 = number_stack.top(); number_stack.pop(); auto num1 = number_stack.top(); number_stack.pop(); if (input == "+") { number_stack.push(num1+num2); } else if (input == "-") { number_stack.push(num1 - num2); } else if (input == "*") { number_stack.push(num1 * num2); } else if (input == "/") { number_stack.push(num1/num2); } } else { //数字直接入栈 char* end; number_stack.push(std::strtof(input.c_str(), &end)); } } return std::move(number_stack.top()); } int main() { const std::vector<std::string> infix_list = { "4.2", "*", "5", "-", "6", "*", "2"}; auto result = InfixToPostfix(infix_list); std::cout << CalcPostFix(result) << '\n'; return 0; }