编写一个c语言程序 求解中缀表达式。
时间: 2024-02-21 15:57:56 浏览: 103
C语言中缀表达式
好的,以下是一个C语言程序,可以求解中缀表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} Stack;
void Stack_Init(Stack *s) {
s->top = -1;
}
int Stack_IsEmpty(Stack *s) {
return s->top == -1;
}
int Stack_IsFull(Stack *s) {
return s->top == MAXSIZE - 1;
}
void Stack_Push(Stack *s, int x) {
if (Stack_IsFull(s)) {
printf("栈已满,无法入栈!\n");
exit(1);
}
s->data[++s->top] = x;
}
int Stack_Pop(Stack *s) {
if (Stack_IsEmpty(s)) {
printf("栈已空,无法出栈!\n");
exit(1);
}
return s->data[s->top--];
}
int Stack_Top(Stack *s) {
if (Stack_IsEmpty(s)) {
printf("栈已空,无法取栈顶元素!\n");
exit(1);
}
return s->data[s->top];
}
int op_priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
printf("不支持的操作符:%c\n", op);
exit(1);
}
}
int calculate(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:
printf("不支持的操作符:%c\n", op);
exit(1);
}
}
int infix_expression(char *str) {
Stack op_stack, num_stack;
int i, len, num, a, b;
char op;
Stack_Init(&op_stack);
Stack_Init(&num_stack);
len = strlen(str);
i = 0;
while (i < len) {
if (str[i] >= '0' && str[i] <= '9') {
num = 0;
while (i < len && str[i] >= '0' && str[i] <= '9') {
num = num * 10 + str[i] - '0';
i++;
}
Stack_Push(&num_stack, num);
} else if (str[i] == '(') {
Stack_Push(&op_stack, str[i]);
i++;
} else if (str[i] == ')') {
while (Stack_Top(&op_stack) != '(') {
b = Stack_Pop(&num_stack);
a = Stack_Pop(&num_stack);
op = Stack_Pop(&op_stack);
Stack_Push(&num_stack, calculate(a, b, op));
}
Stack_Pop(&op_stack);
i++;
} else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {
while (!Stack_IsEmpty(&op_stack) && op_priority(str[i]) <= op_priority(Stack_Top(&op_stack))) {
b = Stack_Pop(&num_stack);
a = Stack_Pop(&num_stack);
op = Stack_Pop(&op_stack);
Stack_Push(&num_stack, calculate(a, b, op));
}
Stack_Push(&op_stack, str[i]);
i++;
} else {
printf("不支持的字符:%c\n", str[i]);
exit(1);
}
}
while (!Stack_IsEmpty(&op_stack)) {
b = Stack_Pop(&num_stack);
a = Stack_Pop(&num_stack);
op = Stack_Pop(&op_stack);
Stack_Push(&num_stack, calculate(a, b, op));
}
return Stack_Pop(&num_stack);
}
int main() {
char str[MAXSIZE];
int result;
printf("请输入一个中缀表达式:");
scanf("%s", str);
result = infix_expression(str);
printf("结果为:%d\n", result);
return 0;
}
```
这个程序首先定义了一个栈的结构体,包含了栈的数据和栈顶指针。然后定义了一些栈的操作函数,包括初始化栈、判断栈是否为空、判断栈是否满、入栈、出栈和取栈顶元素等。接着定义了两个辅助函数,一个用于获取操作符的优先级,另一个用于计算两个数的运算结果。最后定义了一个函数用于求解中缀表达式,这个函数使用了两个栈,一个用于存储操作符,一个用于存储数字。在遍历中缀表达式的过程中,如果遇到数字,就直接将其入数字栈;如果遇到左括号,就将其入操作符栈;如果遇到右括号,就将操作符栈中的操作符依次出栈,同时从数字栈中弹出两个数字进行计算,并将计算结果再次入数字栈;如果遇到其他操作符,就将操作符栈中优先级高于等于当前操作符的操作符依次出栈,同时从数字栈中弹出两个数字进行计算,并将计算结果再次入数字栈。最后,当操作符栈为空时,数字栈中存储的就是中缀表达式的计算结果。
阅读全文