用C语言和栈数据结构和递归的算法写一个简单LISP算术表达式计算器程序
时间: 2024-04-21 22:23:01 浏览: 240
当然可以!以下是一个用C语言和栈数据结构和递归算法实现的简单LISP算术表达式计算器程序的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_SIZE 100
typedef struct {
int data[MAX_EXPR_SIZE];
int top;
} Stack;
void push(Stack *stack, int value) {
if (stack->top == MAX_EXPR_SIZE - 1) {
printf("栈已满!\n");
exit(1);
}
stack->top++;
stack->data[stack->top] = value;
}
int pop(Stack *stack) {
if (stack->top == -1) {
printf("栈已空!\n");
exit(1);
}
int value = stack->data[stack->top];
stack->top--;
return value;
}
int evaluate(Stack *stack, char *expr) {
if (*expr == '\0') {
printf("表达式错误!\n");
exit(1);
}
if (isdigit(*expr)) {
return atoi(expr);
}
if (*expr == '(') {
expr++;
int result = evaluate(stack, expr);
push(stack, result);
while (*expr != ')') {
expr++;
int operand = evaluate(stack, expr);
int operator_ = pop(stack);
switch (*expr) {
case '+':
result += operand;
break;
case '-':
result -= operand;
break;
case '*':
result *= operand;
break;
case '/':
if (operand == 0) {
printf("除数不能为0!\n");
exit(1);
}
result /= operand;
break;
default:
printf("不支持的操作符!\n");
exit(1);
}
}
expr++; // 跳过 ')'
return result;
}
printf("表达式错误!\n");
exit(1);
}
int main() {
char expr[MAX_EXPR_SIZE];
printf("请输入一个LISP算术表达式:");
fgets(expr, MAX_EXPR_SIZE, stdin);
// 去除换行符
expr[strcspn(expr, "\n")] = '\0';
Stack stack;
stack.top = -1;
int result = evaluate(&stack, expr);
printf("计算结果:%d\n", result);
return 0;
}
```
你可以输入类似于 `( + 2 3 )` 的LISP算术表达式,程序将会计算并输出结果。注意,程序对表达式的检查并不完善,只实现了简单的功能,仅供参考。
阅读全文