【编程题]算术表达式求值。演示程序和源程序已给出。用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-+/0。写源程序中的double deal_exp (char*exp)函数,对这个算术表达式求值,返回结果。不限制方法,你可以用“原始”的多遍日描字符串,也可以用先进一点的栈(本课程前面接触的栈都是操作系统提供给程序以实现局部变量定义和函数调用的,现在你需要自己创建并使用栈了)。为便于集中精力在功能方面,可以不用检查用户输入的合法性。
时间: 2024-02-06 11:12:08 浏览: 89
下面是一个使用栈实现的算术表达式求值的函数 `deal_exp` 的实现:
```c++
#include <stack>
#include <cstring>
#include <cctype>
double deal_exp(char* exp) {
std::stack<double> nums;
std::stack<char> ops;
int len = strlen(exp);
for (int i = 0; i < len; i++) {
if (isspace(exp[i])) { // 忽略空格
continue;
} else if (isdigit(exp[i]) || (i == 0 && exp[i] == '-')) { // 处理数字
int j = i;
while (isdigit(exp[j+1])) j++;
std::string num_str(exp+i, j-i+1);
double num = std::stod(num_str);
nums.push(num);
i = j;
} else if (exp[i] == '+' || exp[i] == '-') { // 处理加减号
while (!ops.empty() && (ops.top() == '+' || ops.top() == '-' || ops.top() == '*' || ops.top() == '/')) {
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if (op == '+') {
nums.push(num1 + num2);
} else if (op == '-') {
nums.push(num1 - num2);
} else if (op == '*') {
nums.push(num1 * num2);
} else if (op == '/') {
nums.push(num1 / num2);
}
}
ops.push(exp[i]);
} else if (exp[i] == '*' || exp[i] == '/') { // 处理乘除号
while (!ops.empty() && (ops.top() == '*' || ops.top() == '/')) {
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if (op == '*') {
nums.push(num1 * num2);
} else if (op == '/') {
nums.push(num1 / num2);
}
}
ops.push(exp[i]);
}
}
while (!ops.empty()) { // 处理剩余的运算符
double num2 = nums.top();
nums.pop();
double num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if (op == '+') {
nums.push(num1 + num2);
} else if (op == '-') {
nums.push(num1 - num2);
} else if (op == '*') {
nums.push(num1 * num2);
} else if (op == '/') {
nums.push(num1 / num2);
}
}
return nums.top();
}
```
该函数首先定义了两个栈,一个用于存储数字,一个用于存储运算符。然后遍历算术表达式的每个字符,根据字符的类型,分别进行处理:
- 如果是空格,直接忽略;
- 如果是数字,将其解析成 `double` 类型的数字,压入数字栈中;
- 如果是加减号,先将栈中的乘除号运算完,再将加减号压入运算符栈中;
- 如果是乘除号,先将栈中的乘除号运算完,再将乘除号压入运算符栈中。
处理完整个表达式之后,再将运算符栈中的运算符依次弹出,并根据运算符类型进行相应的计算,最终得到结果并返回。
阅读全文