我选择的题目是:
【题目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;
}