我选择的题目是:

【题目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;
}