用c++写一个把含小数和负数的中缀表达式转换成后缀表达式的函数
时间: 2024-03-26 21:34:34 浏览: 81
表达式转换
好的,我来为你写一个把含小数和负数的中缀表达式转换成后缀表达式的函数。
思路如下:
1. 定义一个栈,保存运算符和左括号。
2. 遍历中缀表达式的每个元素。
3. 如果是数字,直接输出。
4. 如果是左括号,入栈。
5. 如果是右括号,将栈中运算符弹出并输出,直到遇到左括号。
6. 如果是运算符,弹出栈中所有优先级大于或等于该运算符的运算符,并输出,然后将该运算符入栈。
7. 遍历完整个表达式后,将栈中所有运算符弹出并输出。
以下是代码实现:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
// 判断是否是运算符
bool isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')');
}
// 比较运算符优先级
int priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 0;
}
}
// 将中缀表达式转换成后缀表达式
string infixToPostfix(string infix) {
stack<char> s;
stringstream ss;
char c;
for (int i = 0; i < infix.length(); i++) {
c = infix[i];
// 是数字,直接输出
if (isdigit(c) || c == '.') {
ss << c;
}
// 是运算符
else if (isOperator(c)) {
// 如果是负数,则加上一个0
if (c == '-' && (i == 0 || isOperator(infix[i - 1]))) {
ss << "0 ";
}
// 如果是左括号,入栈
else if (c == '(') {
s.push(c);
}
// 如果是右括号,弹出栈中的运算符并输出,直到遇到左括号
else if (c == ')') {
while (s.top() != '(') {
ss << s.top() << " ";
s.pop();
}
s.pop();
}
// 如果是其他运算符,弹出栈中所有优先级大于或等于该运算符的运算符,并输出,然后将该运算符入栈
else {
while (!s.empty() && s.top() != '(' && priority(s.top()) >= priority(c)) {
ss << s.top() << " ";
s.pop();
}
s.push(c);
}
}
}
while (!s.empty()) {
ss << s.top() << " ";
s.pop();
}
return ss.str();
}
int main() {
string infix = "2.5+(3-1)*4-3/2";
string postfix = infixToPostfix(infix);
cout << postfix << endl; // 输出:2.5 3 1 - 4 * + 3 2 / -
return 0;
}
```
希望能帮助到你。
阅读全文