C++ 递归算法实现中缀表达式转后缀表达式
以下是使用递归算法实现将中缀表达式转换为后缀表达式的代码:
#include <iostream>
#include <stack>
#include <string>
// 判断字符是否为运算符
bool isOperator(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/') {
return true;
}
return false;
}
// 判断字符是否为左括号
bool isLeftParenthesis(char c) {
if (c == '(') {
return true;
}
return false;
}
// 判断字符是否为右括号
bool isRightParenthesis(char c) {
if (c == ')') {
return true;
}
return false;
}
// 判断运算符的优先级
int getPriority(char op) {
if (op == '*' || op == '/') {
return 2;
} else if (op == '+' || op == '-') {
return 1;
}
return 0;
}
// 将中缀表达式转换为后缀表达式
std::string infixToPostfix(const std::string& infixExpression, int start, int end) {
if (start > end) {
return '';
}
std::stack<char> operatorStack;
std::string postfixExpression;
for (int i = start; i <= end; i++) {
char c = infixExpression[i];
if (isOperator(c)) {
while (!operatorStack.empty() && isOperator(operatorStack.top()) &&
getPriority(operatorStack.top()) >= getPriority(c)) {
postfixExpression += operatorStack.top();
operatorStack.pop();
}
operatorStack.push(c);
} else if (isLeftParenthesis(c)) {
operatorStack.push(c);
} else if (isRightParenthesis(c)) {
while (!operatorStack.empty() && !isLeftParenthesis(operatorStack.top())) {
postfixExpression += operatorStack.top();
operatorStack.pop();
}
if (!operatorStack.empty() && isLeftParenthesis(operatorStack.top())) {
operatorStack.pop();
} else {
// 括号不配对,返回空字符串表示出错
return '';
}
} else {
// 操作数直接添加到后缀表达式中
postfixExpression += c;
}
}
while (!operatorStack.empty()) {
if (isLeftParenthesis(operatorStack.top()) || isRightParenthesis(operatorStack.top())) {
// 括号不配对,返回空字符串表示出错
return '';
}
postfixExpression += operatorStack.top();
operatorStack.pop();
}
return postfixExpression;
}
int main() {
std::string infixExpression;
std::cout << '请输入中缀表达式:';
std::cin >> infixExpression;
std::string postfixExpression = infixToPostfix(infixExpression, 0, infixExpression.length() - 1);
if (postfixExpression == '') {
std::cout << '表达式不合法!' << std::endl;
} else {
std::cout << '后缀表达式:' << postfixExpression << std::endl;
}
return 0;
}
示例输入和输出与之前的代码相同,这次使用了递归算法实现了将中缀表达式转换为后缀表达式的功能。希望这次的代码满足你的需求。
原文地址: https://www.cveoy.top/t/topic/bfRa 著作权归作者所有。请勿转载和采集!