用C++STL中的栈实现中缀表达式转后缀表达式
时间: 2024-04-23 12:27:57 浏览: 134
要使用C++ STL中的栈来实现中缀表达式转后缀表达式,可以按照以下步骤进行:
1. 创建一个空的栈,用于存储运算符。
2. 遍历中缀表达式的每个字符:
- 如果是操作数(数字),直接将其输出到后缀表达式。
- 如果是左括号 '(',将其推入栈中。
- 如果是右括号 ')',则将栈中的运算符依次弹出并输出到后缀表达式,直到遇到左括号 '('。注意:左括号 '('不输出到后缀表达式,也不入栈。
- 如果是运算符 (+, -, *, /, ^),则:
- 如果栈为空,或者栈顶元素为左括号 '(',则将运算符推入栈中。
- 否则,比较当前运算符与栈顶运算符的优先级。如果当前运算符的优先级小于或等于栈顶运算符的优先级,则将栈顶运算符弹出并输出到后缀表达式,直到栈为空或者栈顶运算符为左括号 '(',然后将当前运算符推入栈中。
3. 遍历完中缀表达式后,如果栈中还有运算符,依次弹出并输出到后缀表达式。
下面是一个用C++ STL中的栈实现中缀转后缀的示例代码:
```cpp
#include <iostream>
#include <stack>
#include <string>
int getPriority(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/')
return 2;
else if (op == '^')
return 3;
else
return 0;
}
std::string infixToPostfix(const std::string& infix) {
std::stack<char> opStack;
std::string postfix;
for (char ch : infix) {
if (isdigit(ch)) {
postfix += ch;
} else if (ch == '(') {
opStack.push(ch);
} else if (ch == ')') {
while (!opStack.empty() && opStack.top() != '(') {
postfix += opStack.top();
opStack.pop();
}
if (!opStack.empty() && opStack.top() == '(') {
opStack.pop();
}
} else {
while (!opStack.empty() && getPriority(ch) <= getPriority(opStack.top())) {
postfix += opStack.top();
opStack.pop();
}
opStack.push(ch);
}
}
while (!opStack.empty()) {
postfix += opStack.top();
opStack.pop();
}
return postfix;
}
int main() {
std::string infix = "5 + 2 * (3 - 1)";
std::string postfix = infixToPostfix(infix);
std::cout << "Infix expression: " << infix << std::endl;
std::cout << "Postfix expression: " << postfix << std::endl;
return 0;
}
```
在上述示例中,我们定义了一个`getPriority`函数来获取运算符的优先级。`infixToPostfix`函数使用一个循环来遍历中缀表达式的每个字符,并根据字符的类型执行相应的操作。最后,我们通过调用`infixToPostfix`函数将中缀表达式转换为后缀表达式,并输出结果。
希望这个示例能帮助你理解如何使用C++ STL中的栈来实现中缀表达式转后缀表达式。
阅读全文