中缀表达式转为后缀表达式(用Qt实现)
时间: 2023-07-12 12:07:59 浏览: 95
中缀表达式转化为后缀表达式
中缀表达式转后缀表达式,也叫做将中缀表达式转换为逆波兰式。
逆波兰式是一种后缀表达式,它的运算符位于操作数之后。例如,中缀表达式 (1+2)*3 转换为逆波兰式就是 1 2 + 3 *。
下面是一个用Qt实现将中缀表达式转换为逆波兰式的示例:
```cpp
#include <QStack>
#include <QStringList>
QStringList infixToSuffix(QStringList infix)
{
QStringList suffix;
QStack<QString> stack;
QMap<QString, int> priority;
priority["+"] = 1;
priority["-"] = 1;
priority["*"] = 2;
priority["/"] = 2;
priority["("] = 0;
foreach (QString token, infix) {
if (token == "(") {
stack.push(token);
} else if (token == ")") {
while (!stack.isEmpty() && stack.top() != "(") {
suffix.append(stack.pop());
}
if (!stack.isEmpty() && stack.top() == "(") {
stack.pop();
}
} else if (priority.contains(token)) {
while (!stack.isEmpty() && priority[token] <= priority[stack.top()]) {
suffix.append(stack.pop());
}
stack.push(token);
} else {
suffix.append(token);
}
}
while (!stack.isEmpty()) {
suffix.append(stack.pop());
}
return suffix;
}
```
这个函数接受一个QStringList类型的中缀表达式,返回一个QStringList类型的逆波兰式。
首先我们定义了一个QStack<QString>类型的栈,用于辅助转换。然后我们定义了一个QMap<QString, int>类型的变量priority,用于记录运算符的优先级。然后我们遍历中缀表达式中的每一个token(操作数或运算符)。
如果当前token是左括号,我们将其压入栈中。
如果当前token是右括号,我们将栈中的元素弹出并添加到逆波兰式中,直到遇到左括号。注意,左括号不会被添加到逆波兰式中。
如果当前token是运算符,我们比较它的优先级和栈顶元素的优先级。如果它的优先级大于栈顶元素的优先级,我们将它压入栈中。否则,我们将栈顶元素弹出并添加到逆波兰式中,直到栈为空或者栈顶元素的优先级小于当前token的优先级。然后我们将当前token压入栈中。
如果当前token是操作数,我们将它添加到逆波兰式中。
最后,如果栈不为空,我们将栈中的元素弹出并添加到逆波兰式中。
下面是一个使用示例:
```cpp
QStringList infix = {"(", "1", "+", "2", ")", "*", "3"};
QStringList suffix = infixToSuffix(infix);
qDebug() << suffix; // 输出: "1" "2" "+" "3" "*"
```
这个示例将中缀表达式 (1+2)*3 转换为逆波兰式 1 2 + 3 *。
阅读全文