用C++写一段代码,实现算术表达式的求解 问题描述:给定一个算术表达式,通过程序求出最后的结果。 基本要求: (1)从键盘输入要求解的算术表达式; (2)采用栈结构进行算术表达式的求解过程; (3)能够判断算术表达式正确与否; (4)对于错误表达式给出提示; (5)对于正确的表达式给出最后的结果;
时间: 2024-02-13 22:02:05 浏览: 92
以下是一个简单的实现示例:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int getOperatorPriority(char op) {
if (op == '*' || op == '/') {
return 2;
} else if (op == '+' || op == '-') {
return 1;
} else {
return 0;
}
}
double calculate(double num1, double num2, char op) {
switch (op) {
case '+': return num1 + num2;
case '-': return num1 - num2;
case '*': return num1 * num2;
case '/': return num1 / num2;
default: return 0;
}
}
bool isValidExpression(string expr) {
int parenthesesCount = 0;
for (char c : expr) {
if (c == '(') {
parenthesesCount++;
} else if (c == ')') {
parenthesesCount--;
if (parenthesesCount < 0) {
return false;
}
}
}
return parenthesesCount == 0;
}
double evaluateExpression(string expr) {
if (!isValidExpression(expr)) {
cout << "Invalid expression" << endl;
return 0;
}
stack<double> numStack;
stack<char> opStack;
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (isdigit(c)) {
double num = c - '0';
while (i + 1 < expr.length() && isdigit(expr[i + 1])) {
num = num * 10 + (expr[i + 1] - '0');
i++;
}
numStack.push(num);
} else if (c == '(') {
opStack.push(c);
} else if (c == ')') {
while (!opStack.empty() && opStack.top() != '(') {
char op = opStack.top();
opStack.pop();
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
double result = calculate(num1, num2, op);
numStack.push(result);
}
opStack.pop();
} else if (isOperator(c)) {
while (!opStack.empty() && opStack.top() != '(' &&
getOperatorPriority(opStack.top()) >= getOperatorPriority(c)) {
char op = opStack.top();
opStack.pop();
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
double result = calculate(num1, num2, op);
numStack.push(result);
}
opStack.push(c);
}
}
while (!opStack.empty()) {
char op = opStack.top();
opStack.pop();
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
double result = calculate(num1, num2, op);
numStack.push(result);
}
return numStack.top();
}
int main() {
string expr;
cout << "Enter an arithmetic expression: ";
getline(cin, expr);
double result = evaluateExpression(expr);
cout << "Result: " << result << endl;
return 0;
}
```
这个实现基于双栈法,一个操作数栈用于存储数字,一个操作符栈用于存储运算符。遍历算术表达式,如果当前字符是数字,则将其转换为数字并压入数字栈;如果当前字符是左括号,则将其压入操作符栈;如果当前字符是右括号,则从操作符栈中弹出运算符,并从数字栈中弹出两个数字进行计算,并将计算的结果压入数字栈,直到遇到左括号;如果当前字符是运算符,则将其压入操作符栈,但在压入之前需要先将操作符栈中优先级高于或等于当前操作符的运算符弹出,并从数字栈中弹出两个数字进行计算,并将计算的结果压入数字栈。最终,当算术表达式遍历完毕后,如果操作符栈中还有运算符,则依次取出运算符并进行计算,直到操作符栈为空,此时数字栈中只剩下一个数字,即为算术表达式的计算结果。
阅读全文
相关推荐
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)