表达式求值c语言
时间: 2023-06-22 12:05:41 浏览: 99
在C语言中,可以使用栈来实现表达式求值。具体步骤如下:
1. 定义两个栈,一个存储操作数,一个存储运算符。
2. 遍历表达式的每个字符,如果是数字则将其转换为整型并入栈,如果是运算符,则判断其优先级,如果优先级高于栈顶运算符,则入栈,否则将栈顶运算符弹出,并从操作数栈中弹出两个数进行运算,将结果压入操作数栈。
3. 当表达式遍历完毕后,如果运算符栈不为空,依次弹出栈顶运算符,并从操作数栈中弹出两个数进行运算,将结果压入操作数栈,直到运算符栈为空。
4. 最后操作数栈中剩下的唯一元素即为表达式的最终值。
以下是一个简单的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
int priority(char c) { // 判断运算符优先级
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
int operate(int a, int b, char op) { // 进行运算
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
int eval(char *expr) { // 表达式求值
Stack opnd, optr;
opnd.top = -1;
optr.top = -1;
int num = 0;
while (*expr) {
if (isdigit(*expr)) { // 数字入栈
num = num * 10 + (*expr - '0');
if (!isdigit(*(expr+1))) {
opnd.data[++opnd.top] = num;
num = 0;
}
} else if (*expr == '(') { // 左括号入栈
optr.data[++optr.top] = *expr;
expr++;
} else if (*expr == ')') { // 右括号弹出操作符栈中左括号以上的符号,进行运算
while (optr.data[optr.top] != '(') {
char op = optr.data[optr.top--];
int b = opnd.data[opnd.top--];
int a = opnd.data[opnd.top--];
opnd.data[++opnd.top] = operate(a, b, op);
}
optr.top--;
expr++;
} else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') { // 运算符入栈
while (optr.top != -1 && priority(optr.data[optr.top]) >= priority(*expr)) {
char op = optr.data[optr.top--];
int b = opnd.data[opnd.top--];
int a = opnd.data[opnd.top--];
opnd.data[++opnd.top] = operate(a, b, op);
}
optr.data[++optr.top] = *expr;
expr++;
} else {
expr++;
}
}
while (optr.top != -1) { // 运算符栈中剩余的操作符依次进行运算
char op = optr.data[optr.top--];
int b = opnd.data[opnd.top--];
int a = opnd.data[opnd.top--];
opnd.data[++opnd.top] = operate(a, b, op);
}
return opnd.data[opnd.top];
}
int main() {
char expr[MAX_SIZE];
printf("请输入表达式:");
scanf("%s", expr);
printf("表达式的值为:%d\n", eval(expr));
return 0;
}
```
注意,上面的代码只能处理整数运算,如果要支持浮点数运算,需要对代码进行修改。
阅读全文