我选择的题目是:
【题目30】简单LISP算术表达式计算:
简单LISP算术表达式(以下简称表达式)定义如下:
一个整数.或者 运算符(表达式,表达式)
例如:6,+(4,5), +( + (2,5),8)都是表达式,其值分别为6,9和15。
设计要求:
(1) 实现LISP四则表达式的求值。
(2) LISP算术表达式的语法检查。
(3) 考虑实现带变元的LISP算术表达式的计算。
使用了顺序栈来存储数据和运算符(并没有注意到要求三的带变元,这导致了我这整个思路是错的)
第一天完成一个只能计算纯数字lisp表达式的程序,其实问题特别多,比如不能计算负数
主要是当时没想到负数
上代码
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //bool(布尔类型的头文件) #include<string.h> #include<math.h> #define maxsize 200 //定义数组大小为200 typedef int elementype; //int类型别名 typedef struct num { elementype data[maxsize]; //数据域 elementype top; //栈顶指针 }numStack; typedef struct oper { char data[maxsize]; //数据域 elementype top; //栈顶指针 }operStack; bool initstack(numStack* s) //初始化栈 { //这里没有给data申请空间建应该是因为数组的大小已经定义完成 s->top = -1; return true; } int initstack(operStack* s) //初始化栈 { //这里没有给data申请空间建应该是因为数组的大小已经定义完成 s->top = -1; return 0; } bool pushNum(numStack* s, elementype e) //数字入栈 { if (s->top == maxsize - 1) return false; else { s->top++; //栈顶指针加一 s->data[s->top] = e; //新插入的元素进栈 return true; } } bool pushOper(operStack* s, char e) //符号入栈 { if (s->top == maxsize - 1) return false; else { s->top++; //栈顶指针加一 s->data[s->top] = e; //新插入的元素进栈 return true; } } int count(numStack *num, operStack *oper) { int num1, num2; int mid; char oper1; if (num->top <= 0) //拿出数字栈顶的两个元素 { printf("表达式有误(数字不够)"); return false; } else { num1 = num->data[num->top]; num->top = num->top - 1; num2 = num->data[num->top]; num->top = num->top - 1; //栈顶指针减二 } if (oper->top == -1) //拿出符号栈顶的一个元素 { printf("表达式有误(运算符不够)"); return false; } else { oper1 = oper->data[oper->top]; oper->top--; } //开始计算最优先的lisp子表达式 if (oper1 == '+') { mid = num1 + num2; } else if (oper1 == '-') { mid = num2 - num1; } else if (oper1 == '*') { mid = num1 * num2; } else if (oper1 == '/') { mid = num2 / num1; } else { printf("表达式有误(不识别的运算符)"); return false; } return mid; } int main() { char str[200]; operStack oper; numStack num; int mid,num1,num2; initstack(&oper); initstack(&num); gets_s(str); int length=strlen(str); for (int i=0; i < length; i++) { if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') { pushOper(&oper, str[i]); } else if (str[i] == '(') { continue; } else if (str[i] == ',') { continue; } else if(str[i] == ')') { mid = count(&num, &oper); pushNum(&num, mid); if (oper.top == -1 || num.top == -1) { printf("%d\n", mid); } else { continue; } } else if(str[i] >= '0'&& str[i] <= '9'){ char* str1 = &str[i]; //printf("5\n"); while (true) { if (str[i + 1] >= '0' && str[i + 1] <= '9') { str1 = strcat(str1, &str[i + 1]); i++; } else { break; } } int nn = atoi(str1); pushNum(&num, nn); } else { break; } } return 0; }