基于栈的中缀算术表达式求值的代码
时间: 2024-06-13 13:04:22 浏览: 189
用栈求前缀表达式的值.zip
根据引用和引用的描述,基于栈的中缀算术表达式求值的代码可以分为以下几个步骤:
1. 创建两个栈,一个用于存放数字,一个用于存放运算符。
2. 从左到右读取中缀算术表达式的每个字符,如果是数字则将其压入数字栈中,如果是运算符则将其与运算符栈顶元素比较优先级,如果当前运算符优先级较高,则将其压入运算符栈中,否则将运算符栈顶元素弹出并与数字栈顶的两个数字进行计算,将计算结果压入数字栈中,直到当前运算符可以压入运算符栈中。
3. 当读取完整个中缀算术表达式后,如果运算符栈中还有运算符,则依次弹出运算符并与数字栈顶的两个数字进行计算,将计算结果压入数字栈中,直到运算符栈为空。
4. 最终数字栈中只剩下一个数字,即为中缀算术表达式的计算结果。
下面是一个基于C++的示例代码:
```
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
using namespace std;
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;
}
}
int main() {
stack<double> nums;
stack<char> ops;
string expr;
double num = 0;
bool hasNum = false;
bool hasDot = false;
ops.push('#');
cin >> expr;
for (int i = 0; i < expr.length(); i++) {
char c = expr[i];
if (isdigit(c)) {
num = num * 10 + (c - '0');
hasNum = true;
if (hasDot) {
hasDot = false;
num /= 10;
}
} else if (c == '.') {
hasDot = true;
} else {
if (hasNum) {
nums.push(num);
num = 0;
hasNum = false;
}
if (c == '(') {
ops.push(c);
} else if (c == ')') {
while (ops.top() != '(') {
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
nums.push(calculate(num1, num2, op));
}
ops.pop();
} else {
while (ops.top() != '#' && (c == '*' || c == '/' || ops.top() == '+' || ops.top() == '-')) {
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
nums.push(calculate(num1, num2, op));
}
ops.push(c);
}
}
}
if (hasNum) {
nums.push(num);
}
while (ops.top() != '#') {
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
nums.push(calculate(num1, num2, op));
}
cout << nums.top() << endl;
return 0;
}
```
阅读全文