用C语言编写表达式求值
时间: 2023-07-18 09:44:13 浏览: 51
可以使用栈来实现表达式求值。
具体步骤如下:
1. 定义两个栈,一个用来存放数字,一个用来存放运算符。
2. 遍历表达式中的每个字符,如果是数字则将其入数字栈,如果是运算符则将其入运算符栈。
3. 每当遇到一个运算符时,从数字栈中弹出两个数字进行运算,并将结果压入数字栈中。
4. 重复步骤3直到遍历完整个表达式,此时数字栈中只剩下一个数字,即为表达式的值。
以下是一个简单的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
int push(Stack *s, int x) {
if (isFull(s)) {
return 0;
}
s->data[++s->top] = x;
return 1;
}
int pop(Stack *s) {
if (isEmpty(s)) {
return 0;
}
return s->data[s->top--];
}
int peep(Stack *s) {
if (isEmpty(s)) {
return 0;
}
return s->data[s->top];
}
int eval(char *expr) {
Stack numStack, opStack;
initStack(&numStack);
initStack(&opStack);
int i = 0;
while (expr[i] != '\0') {
if (isdigit(expr[i])) {
int num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
push(&numStack, num);
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
while (!isEmpty(&opStack) && peep(&opStack) != '(' && ((expr[i] == '*' || expr[i] == '/') || (expr[i] == '+' || expr[i] == '-') && (peep(&opStack) == '*' || peep(&opStack) == '/'))) {
int num2 = pop(&numStack);
int num1 = pop(&numStack);
char op = pop(&opStack);
int result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
push(&numStack, result);
}
push(&opStack, expr[i]);
i++;
} else if (expr[i] == '(') {
push(&opStack, expr[i]);
i++;
} else if (expr[i] == ')') {
while (!isEmpty(&opStack) && peep(&opStack) != '(') {
int num2 = pop(&numStack);
int num1 = pop(&numStack);
char op = pop(&opStack);
int result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
push(&numStack, result);
}
pop(&opStack);
i++;
} else {
i++;
}
}
while (!isEmpty(&opStack)) {
int num2 = pop(&numStack);
int num1 = pop(&numStack);
char op = pop(&opStack);
int result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
push(&numStack, result);
}
return pop(&numStack);
}
int main() {
char expr[MAX_SIZE];
printf("Enter an expression: ");
fgets(expr, MAX_SIZE, stdin);
int result = eval(expr);
printf("Result: %d\n", result);
return 0;
}
```