用c语言写后缀表达式求值:将输入的后缀表达式求值后输出(例如输入14 3 20 5 / * 8 - + @,输出18)
时间: 2024-02-12 15:05:15 浏览: 101
基于C语言实现表达式求值【100011941】
好的,这里是用 C 语言实现后缀表达式求值的代码,具体实现方法和 Python 版本类似,也是使用栈来辅助计算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100 // 栈的最大容量
typedef struct {
int top; // 栈顶指针
int data[MAX_STACK_SIZE]; // 栈中保存的数据
} Stack;
// 初始化栈
void init_stack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int val) {
if (is_full(s)) {
printf("Stack overflow!\n");
exit(1);
}
s->data[++s->top] = val;
}
// 出栈操作
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow!\n");
exit(1);
}
return s->data[s->top--];
}
// 后缀表达式求值
int evaluate_postfix(char *expr) {
Stack s;
init_stack(&s);
while (*expr) {
if (isdigit(*expr)) { // 如果是数字,将其转换为整数后入栈
int val = 0;
while (isdigit(*expr)) {
val = val * 10 + (*expr - '0');
expr++;
}
push(&s, val);
} else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') { // 如果是运算符,从栈中弹出两个操作数,进行运算后将结果入栈
int op2 = pop(&s);
int op1 = pop(&s);
int result;
switch (*expr) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
}
push(&s, result);
}
expr++;
}
return pop(&s); // 最后栈中只剩下一个元素,即为表达式的值
}
int main() {
char expr[] = "14 3 20 5 / * 8 - +";
int result = evaluate_postfix(expr);
printf("%d\n", result); // 输出 18
return 0;
}
```
在该代码中,我们定义了一个 `Stack` 结构体来表示栈,包含 `top` 指针和 `data` 数组。初始化栈、判断栈是否为空或已满、入栈和出栈等操作也都被封装为函数。在 `evaluate_postfix` 函数中,我们首先初始化一个栈,然后依次遍历后缀表达式中的每个字符,如果是数字则入栈,如果是运算符则从栈中弹出两个操作数进行计算,最后将结果入栈。最终栈中只剩下一个元素,即为表达式的值。最后通过 `main` 函数调用 `evaluate_postfix` 函数进行计算,输出结果。
阅读全文