请用链栈写一个表达式求值的C语言代码
时间: 2023-12-03 11:44:18 浏览: 36
以下是使用链栈实现表达式求值的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100 // 最大表达式长度
typedef struct StackNode {
int data;
struct StackNode *next;
} StackNode, *LinkStack;
// 创建一个空栈
LinkStack createStack() {
LinkStack s = (LinkStack) malloc(sizeof(StackNode));
s->next = NULL;
return s;
}
// 判断栈是否为空
int isStackEmpty(LinkStack s) {
return s->next == NULL;
}
// 入栈
void push(LinkStack s, int data) {
StackNode *node = (StackNode*) malloc(sizeof(StackNode));
node->data = data;
node->next = s->next;
s->next = node;
}
// 出栈
int pop(LinkStack s) {
if (isStackEmpty(s)) {
printf("stack is empty!");
exit(1);
}
StackNode *top = s->next;
int data = top->data;
s->next = top->next;
free(top);
return data;
}
// 获取栈顶元素
int getTop(LinkStack s) {
if (isStackEmpty(s)) {
printf("stack is empty!");
exit(1);
}
return s->next->data;
}
// 表达式求值
int eval(char expr[]) {
LinkStack numStack = createStack(); // 数字栈
LinkStack opStack = createStack(); // 操作符栈
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] == '-') {
while (!isStackEmpty(opStack) && (getTop(opStack) == '+' || getTop(opStack) == '-' || getTop(opStack) == '*' || getTop(opStack) == '/')) {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
int result;
if (op == '+') {
result = a + b;
} else if (op == '-') {
result = a - b;
} else if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numStack, result);
}
push(opStack, expr[i]);
i++;
} else if (expr[i] == '*' || expr[i] == '/') {
while (!isStackEmpty(opStack) && (getTop(opStack) == '*' || getTop(opStack) == '/')) {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
int result;
if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numStack, result);
}
push(opStack, expr[i]);
i++;
} else if (expr[i] == '(') {
push(opStack, expr[i]);
i++;
} else if (expr[i] == ')') {
while (getTop(opStack) != '(') {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
int result;
if (op == '+') {
result = a + b;
} else if (op == '-') {
result = a - b;
} else if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numStack, result);
}
pop(opStack); // 弹出左括号
i++;
} else {
printf("invalid expr!");
exit(1);
}
}
while (!isStackEmpty(opStack)) {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
int result;
if (op == '+') {
result = a + b;
} else if (op == '-') {
result = a - b;
} else if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numStack, result);
}
int result = pop(numStack);
return result;
}
int main() {
char expr[MAX_EXPR_LEN];
printf("请输入表达式:");
scanf("%s", expr);
int result = eval(expr);
printf("表达式的值为:%d\n", result);
return 0;
}
```
以上代码实现了一个支持加、减、乘、除、括号的表达式求值的功能。