只用中缀形式输出完整代码实现简单计算器
时间: 2024-02-13 11:06:04 浏览: 21
以下是一个简单的计算器实现,支持加、减、乘、除、括号和小数点:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <sstream>
using namespace std;
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
bool isLeftParenthesis(char c) {
return c == '(';
}
bool isRightParenthesis(char c) {
return c == ')';
}
int precedence(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
double evaluate(double a, double b, char op) {
if (op == '+') {
return a + b;
} else if (op == '-') {
return a - b;
} else if (op == '*') {
return a * b;
} else if (op == '/') {
return a / b;
} else {
return 0;
}
}
double evaluatePostfix(string expr) {
stack<double> s;
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (isdigit(c)) {
double num = 0;
while (isdigit(c) || c == '.') {
num = num * 10 + (c - '0');
i++;
c = expr[i];
}
i--;
s.push(num);
} else if (isOperator(c)) {
double b = s.top();
s.pop();
double a = s.top();
s.pop();
double result = evaluate(a, b, c);
s.push(result);
}
}
return s.top();
}
string infixToPostfix(string expr) {
stack<char> s;
stringstream result;
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (isdigit(c)) {
while (isdigit(c) || c == '.') {
result << c;
i++;
c = expr[i];
}
i--;
result << " ";
} else if (isOperator(c)) {
while (!s.empty() && s.top() != '(' && precedence(s.top()) >= precedence(c)) {
result << s.top() << " ";
s.pop();
}
s.push(c);
} else if (isLeftParenthesis(c)) {
s.push(c);
} else if (isRightParenthesis(c)) {
while (!s.empty() && !isLeftParenthesis(s.top())) {
result << s.top() << " ";
s.pop();
}
s.pop();
}
}
while (!s.empty()) {
result << s.top() << " ";
s.pop();
}
return result.str();
}
int main() {
string expr;
cout << "请输入表达式:";
getline(cin, expr);
string postfixExpr = infixToPostfix(expr);
cout << "后缀表达式:" << postfixExpr << endl;
double result = evaluatePostfix(postfixExpr);
cout << "计算结果:" << result << endl;
return 0;
}
```
使用时,输入表达式,例如:
```
(2 + 3) * 4.5 - 1.5 / 3
```
程序会输出转换后的后缀表达式和计算结果。