用C++实现用户输入表达式,使用堆栈对表达式进行求解并且输出结果
时间: 2024-09-29 19:13:02 浏览: 31
用栈实现算术表达式的计算
在C++中,我们可以使用堆栈来解析和计算数学表达式,特别是那些使用了运算符优先级的表达式。这里是一个简单的实现,我们将使用递归下降解析器来处理用户输入的算术表达式。请注意,这种方法仅适用于基本的算术运算和没有括号的情况。
```cpp
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
bool isOperator(char op) {
return op == '+' || op == '-' || op == '*' || op == '/';
}
double applyOperator(std::stack<double>& values, char op) {
double right = values.top(); values.pop();
double left = values.top(); values.pop();
switch (op) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/':
if (right == 0) throw std::runtime_error("Division by zero!");
return left / right;
}
}
double evaluateExpression(const std::string& expression) {
std::stack<double> values;
for (char c : expression) {
if (isdigit(c)) {
double num = 0;
while (isdigit(c)) {
num = num * 10 + c - '0';
c = getchar();
}
values.push(num);
} else if (c == '(') {
// Do nothing for now, we'll handle parentheses later
} else if (c == ')') {
while (!values.empty() && values.top() != '(') {
double result = applyOperator(values, values.top());
values.pop();
values.pop();
values.push(result);
}
if (!values.empty()) values.pop(); // Pop the '('
} else if (isOperator(c)) {
while (!values.empty() && isOperator(values.top()) && precedence(c) <= precedence(values.top())) {
double result = applyOperator(values, values.top());
values.pop();
}
values.push(c);
} else {
throw std::runtime_error("Invalid character in expression");
}
}
while (!values.empty()) {
double result = applyOperator(values, values.top());
values.pop();
values.pop();
values.push(result);
}
return values.top();
}
int main() {
try {
std::string expression;
std::cout << "Enter an arithmetic expression: ";
getline(std::cin, expression);
double result = evaluateExpression(expression);
std::cout << "Result: " << result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
此代码首先判断字符是否为数字,如果是则转换为数字并推入堆栈。遇到左括号时不做处理,遇到右括号会将之前的操作依次还原到堆栈直到遇到左括号。对于运算符,会优先处理优先级较高的运算符。如果遇到无效字符,则抛出异常。
阅读全文