用c语言写一个代码,要求输入一个中缀算术表达式,求解表达式的值。运算符包括 +、-、*、/、(、)和=,参加运算的数为正数且为double类型。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀表达式再进行计算,只考虑二元运算即可。)
时间: 2024-02-11 07:08:02 浏览: 80
好的,下面是用C语言实现中缀表达式计算的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
double data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
void push(Stack *s, double x) {
if (s->top == MAX_SIZE - 1) {
printf("Stack is full\n");
exit(1);
}
s->top++;
s->data[s->top] = x;
}
double pop(Stack *s) {
if (s->top == -1) {
printf("Stack is empty\n");
exit(1);
}
double x = s->data[s->top];
s->top--;
return x;
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')';
}
int priority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
printf("Invalid operator\n");
exit(1);
}
}
double calculate(double a, char op, double b) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
printf("Invalid operator\n");
exit(1);
}
}
double eval(char *expr) {
Stack num_stack, op_stack;
init(&num_stack);
init(&op_stack);
while (*expr) {
if (isdigit(*expr)) {
double num = 0;
while (isdigit(*expr)) {
num = num * 10 + (*expr - '0');
expr++;
}
push(&num_stack, num);
} else if (is_operator(*expr)) {
if (*expr == '(') {
push(&op_stack, '(');
} else if (*expr == ')') {
while (op_stack.data[op_stack.top] != '(') {
char op = pop(&op_stack);
double b = pop(&num_stack);
double a = pop(&num_stack);
double result = calculate(a, op, b);
push(&num_stack, result);
}
pop(&op_stack);
} else {
while (op_stack.top != -1 && priority(op_stack.data[op_stack.top]) >= priority(*expr)) {
char op = pop(&op_stack);
double b = pop(&num_stack);
double a = pop(&num_stack);
double result = calculate(a, op, b);
push(&num_stack, result);
}
push(&op_stack, *expr);
}
expr++;
} else {
printf("Invalid character\n");
exit(1);
}
}
while (op_stack.top != -1) {
char op = pop(&op_stack);
double b = pop(&num_stack);
double a = pop(&num_stack);
double result = calculate(a, op, b);
push(&num_stack, result);
}
return pop(&num_stack);
}
int main() {
char expr[MAX_SIZE];
printf("Please enter an infix expression: ");
fgets(expr, MAX_SIZE, stdin);
double result = eval(expr);
printf("The result is: %g\n", result);
return 0;
}
```
这个程序使用两个栈,一个存放数字,一个存放运算符。在遍历中缀表达式的过程中,遇到数字就放入数字栈中,遇到运算符就与运算符栈顶元素比较优先级,如果当前运算符的优先级小于等于栈顶运算符的优先级,就弹出栈顶运算符,并从数字栈中弹出两个数字进行计算,将计算结果放入数字栈中;否则就把当前运算符压入运算符栈中。遇到左括号时,直接将其压入运算符栈中;遇到右括号时,就一直弹出运算符栈顶元素,直到遇到左括号为止,弹出的运算符依次与数字栈中的两个数字计算,并将计算结果放入数字栈中。最终,数字栈中只剩下一个元素,即为表达式的值。
希望这个代码能够帮助你解决问题!
阅读全文