使用c语言实现后缀表达式求值
时间: 2023-09-01 19:07:38 浏览: 215
后缀表达式求值可以使用栈来完成。具体实现过程如下:
1. 定义一个栈结构体,存储数据和栈顶指针。
```c
typedef struct stack {
int data[MAX_SIZE];
int top;
} Stack;
```
2. 定义一个函数,用于判断一个字符是否为数字。
```c
int isDigit(char c) {
return (c >= '0' && c <= '9');
}
```
3. 定义一个函数,用于将后缀表达式字符串转换成整数。
```c
int toInt(char* str) {
int res = 0;
for (int i = 0; str[i] != '\0'; i++) {
res = res * 10 + (str[i] - '0');
}
return res;
}
```
4. 定义一个函数,用于计算两个数的加、减、乘、除。
```c
int calc(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;
}
}
```
5. 定义一个函数,用于计算后缀表达式的值。
```c
int eval(char* expr) {
Stack s;
s.top = -1;
for (int i = 0; expr[i] != '\0'; i++) {
if (isDigit(expr[i])) {
// 如果是数字,将其转换成整数并入栈
int num = toInt(&expr[i]);
s.data[++s.top] = num;
// 将 i 移动到数字串的末尾
while (isDigit(expr[i])) {
i++;
}
i--;
} else {
// 如果是操作符,弹出栈顶的两个数进行运算,并将结果入栈
int b = s.data[s.top--];
int a = s.data[s.top--];
int res = calc(a, b, expr[i]);
s.data[++s.top] = res;
}
}
return s.data[s.top];
}
```
完整代码如下:
```c
#include <stdio.h>
#define MAX_SIZE 100
typedef struct stack {
int data[MAX_SIZE];
int top;
} Stack;
int isDigit(char c) {
return (c >= '0' && c <= '9');
}
int toInt(char* str) {
int res = 0;
for (int i = 0; str[i] != '\0'; i++) {
res = res * 10 + (str[i] - '0');
}
return res;
}
int calc(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 s;
s.top = -1;
for (int i = 0; expr[i] != '\0'; i++) {
if (isDigit(expr[i])) {
// 如果是数字,将其转换成整数并入栈
int num = toInt(&expr[i]);
s.data[++s.top] = num;
// 将 i 移动到数字串的末尾
while (isDigit(expr[i])) {
i++;
}
i--;
} else {
// 如果是操作符,弹出栈顶的两个数进行运算,并将结果入栈
int b = s.data[s.top--];
int a = s.data[s.top--];
int res = calc(a, b, expr[i]);
s.data[++s.top] = res;
}
}
return s.data[s.top];
}
int main() {
char expr[MAX_SIZE];
printf("请输入后缀表达式:");
scanf("%s", expr);
int res = eval(expr);
printf("计算结果为:%d\n", res);
return 0;
}
```
阅读全文