用C语言写基于栈的中缀算术表达式求值,例如输入2+2= 或20*(4.5-3)= 输出4.00 30.00
时间: 2023-06-09 14:05:29 浏览: 127
您好,谢谢您的提问。使用C语言编写基于栈的中缀算术表达式求值,可以按照以下步骤进行:
1. 定义一个栈结构体,包含一个数组和一个栈顶指针。
```
typedef struct stack {
double data[MAXSIZE]; // 数组存储栈中的数据
int top; // 栈顶指针
} Stack;
```
2. 定义一个函数用来判断一个字符是不是数字。
```
int is_digit(char ch) {
if (ch >= '0' && ch <= '9') {
return 1;
} else {
return 0;
}
}
```
3. 定义一个函数用来判断一个字符是不是运算符。
```
int is_operator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
return 1;
} else {
return 0;
}
}
```
4. 定义一个函数用来获取数字。该函数从表达式的当前位置开始,向后扫描,将连续的数字字符转换成一个实数。
```
double get_number(char *str, int *p) {
double num = 0;
int dot = 0;
while (is_digit(str[*p]) || str[*p] == '.') {
if (str[*p] == '.') {
dot = 1; // 如果遇到小数点则标记为小数
++(*p); // 继续扫描
continue;
}
num = num * 10 + (str[*p] - '0'); // 将数字字符转换成实数
if (dot) {
++dot; // 统计当前小数点后面有几位数字
}
++(*p); // 继续扫描
}
if (dot) {
num = num / pow(10, dot - 1); // 如果是小数,则除以对应的10的次方数
}
return num;
}
```
5. 定义一个函数用来获取运算符。该函数从表达式的当前位置开始,向后扫描,直到找到一个运算符。
```
char get_operator(char *str, int *p) {
char op = 0;
while (is_operator(str[*p])) {
op = str[*p];
++(*p); // 继续扫描
}
return op;
}
```
6. 定义一个函数用来计算两个数的结果。该函数接受两个实数和一个操作符,返回两个实数以该操作符计算后的结果。
```
double calculate(double num1, double num2, char op) {
double result = 0;
switch (op) { // 根据操作符进行计算
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
return result;
}
```
7. 定义一个函数用来计算一个中缀表达式的结果。
```
double eval_expression(char *str) {
Stack s;
s.top = -1; // 栈初始化
int i = 0;
while (str[i] != '\0') { // 逐个字符扫描表达式
if (is_digit(str[i])) { // 如果是数字,则将其入栈
double num = get_number(str, &i);
s.data[++s.top] = num;
} else if (is_operator(str[i])) { // 如果是运算符,则取出栈顶的两个数进行计算,并将结果入栈
double num2 = s.data[s.top--];
double num1 = s.data[s.top--];
char op = get_operator(str, &i);
double result = calculate(num1, num2, op);
s.data[++s.top] = result;
} else {
++i;
}
}
return s.data[s.top]; // 最终栈中的唯一元素就是表达式的结果
}
```
8. 最后,编写一个main函数,用来测试该函数。
```
int main() {
char str[100];
// 输入中缀表达式字符串
scanf("%s", str);
// 计算结果
double result = eval_expression(str);
// 输出结果
printf("%.2lf", result);
return 0;
}
```
按照上述步骤,就可以写出一个基于栈的中缀算术表达式求值的C语言程序。如果有疑问,请随时问我。
阅读全文