用栈写一个表达式计算器
时间: 2023-07-01 15:12:28 浏览: 45
好的,下面是一个用栈实现的表达式计算器,它支持加、减、乘、除、括号等基本运算符和功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义栈结构
struct stack {
int *data;
int top;
int size;
};
// 创建栈
struct stack *create_stack(int size) {
struct stack *s = (struct stack*)malloc(sizeof(struct stack));
s->data = (int*)malloc(size * sizeof(int));
s->top = -1;
s->size = size;
return s;
}
// 销毁栈
void destroy_stack(struct stack *s) {
if (s != NULL) {
free(s->data);
free(s);
}
}
// 入栈
void push(struct stack *s, int val) {
if (s->top < s->size - 1) {
s->top++;
s->data[s->top] = val;
}
}
// 出栈
int pop(struct stack *s) {
if (s->top >= 0) {
int val = s->data[s->top];
s->top--;
return val;
}
return 0;
}
// 获取栈顶元素
int top(struct stack *s) {
if (s->top >= 0) {
return s->data[s->top];
}
return 0;
}
// 判断栈是否为空
int is_empty(struct stack *s) {
return s->top < 0;
}
// 解析数字
int parse_number(char *expr, int *index) {
int val = 0;
while (isdigit(expr[*index])) {
val = val * 10 + (expr[*index] - '0');
(*index)++;
}
return val;
}
// 计算表达式
int eval_expr(char *expr) {
struct stack *nums = create_stack(100);
struct stack *ops = create_stack(100);
int index = 0;
while (expr[index] != '\0') {
if (isdigit(expr[index])) {
int val = parse_number(expr, &index);
push(nums, val);
} else if (expr[index] == '(') {
push(ops, '(');
index++;
} else if (expr[index] == '+' || expr[index] == '-') {
while (!is_empty(ops) && top(ops) != '(') {
int val2 = pop(nums);
int val1 = pop(nums);
int op = pop(ops);
if (op == '+') {
push(nums, val1 + val2);
} else if (op == '-') {
push(nums, val1 - val2);
}
}
push(ops, expr[index]);
index++;
} else if (expr[index] == '*' || expr[index] == '/') {
while (!is_empty(ops) && (top(ops) == '*' || top(ops) == '/')) {
int val2 = pop(nums);
int val1 = pop(nums);
int op = pop(ops);
if (op == '*') {
push(nums, val1 * val2);
} else if (op == '/') {
push(nums, val1 / val2);
}
}
push(ops, expr[index]);
index++;
} else if (expr[index] == ')') {
while (!is_empty(ops) && top(ops) != '(') {
int val2 = pop(nums);
int val1 = pop(nums);
int op = pop(ops);
if (op == '+') {
push(nums, val1 + val2);
} else if (op == '-') {
push(nums, val1 - val2);
} else if (op == '*') {
push(nums, val1 * val2);
} else if (op == '/') {
push(nums, val1 / val2);
}
}
pop(ops);
index++;
} else {
index++;
}
}
while (!is_empty(ops)) {
int val2 = pop(nums);
int val1 = pop(nums);
int op = pop(ops);
if (op == '+') {
push(nums, val1 + val2);
} else if (op == '-') {
push(nums, val1 - val2);
} else if (op == '*') {
push(nums, val1 * val2);
} else if (op == '/') {
push(nums, val1 / val2);
}
}
int result = top(nums);
destroy_stack(nums);
destroy_stack(ops);
return result;
}
// 主函数
int main() {
char expr[100];
printf("请输入表达式:");
scanf("%s", expr);
int result = eval_expr(expr);
printf("表达式的值为:%d\n", result);
return 0;
}
```
您可以将以上代码保存为一个.c文件并编译运行,输入表达式后即可计算出表达式的值。