题目描述
LISP语言唯一的语法就是括号要配对
形如(OP P1 P2 ...),括号内元素由单个空格分割。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型。注意:参数P1,P2也有可能是另外一个嵌套的(OP P1 P2...),当前OP类型为add/sub/mul/div(全小写) 分别代表整数的加减乘除法,简单起见,所有OP参数个数均为2。
举例:
输入:(mul 3 -7)输出:-21
输入:(add 1 2)输出:3
输入:(sub (mul 2 4) (div 9 3))输出:5
输入:(div 1 0)输出:error
题目涉及数字均为整数,可能为负:不考虑32位溢出翻转,计算过程中也不会发生32位溢出翻转。除零错误时,输出“error”,除法遇除不尽,向下取整,即3/2=1
输入描述
输入为长度不超过512的字符串,用例保证了无语法错误
输出描述
输出计算结果或者“error”
用例
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.LISP语言唯一的语法就是括号要配对,形如(OP P1 P2...)括号内的元素由单个空格分割。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型(简单起见这里所有OP的参数均为2),注意:参数P1,P2也有可能是另外一个嵌套的(OP P1 P2...),当前OP类型为add/sub/mul/div(全小写)分别代表加减乘除法。
2.题目涉及数字均为整数,可能为负;不考虑32位溢出翻转,计算过程中也不会发生32位溢出翻转。除零错误时,输出“error”,除法遇除不尽,向下取整,即3 / 2 = 1;
3.输入描述:输入长度不超过512的字符串,用例保证了无语法错误
4.输出描述:输出计算结果或者“error”
二、解题思路
1.我们建立两个数组一个用于存储我们的运算符号一个用于存储我们的数字
2.每当遇到左括号的时候我们将括号右边的运算符和数字分别压倒栈中
3.如果第一个数字之后不是左括号而是数字,我们根据栈中的符号对栈顶的数字进行运算,(弹出运算符)
4.如果遇到右括号我们查看运算符的数组中是否还有剩余的运算符,如果有那么我们
5.弹出栈顶元素并和当前栈顶位置的元素做运算(弹出运算符)并且索引值减小1
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
int main() {
char str[512];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
int len = strlen(str);
int operator[512];
int nums[512];
int oi = 0;
int ni = 0;
for(int i = 0; i < len; i++) {
if(str[i] == '(') {
if(str[i + 1] == 'a' && str[i + 2] == 'd' && str[i + 3] == 'd' && str[i + 4] == ' ') {
operator[oi++] = 0;
} else if(str[i + 1] == 's' && str[i + 2] == 'u' && str[i + 3] == 'b' && str[i + 4] == ' ') {
operator[oi++] = 1;
} else if(str[i + 1] == 'm' && str[i + 2] == 'u' && str[i + 3] == 'l' && str[i + 4] == ' ') {
operator[oi++] = 2;
} else if(str[i + 1] == 'd' && str[i + 2] == 'i' && str[i + 3] == 'v' && str[i + 4] == ' ') {
operator[oi++] = 3;
} else {
printf("error\n");
return 0;
}
i += 4;
}
bool n = false;
if(str[i] == '-') {
n = true;
i++;
}
if(isdigit(str[i])) {
int tempnum = str[i] - '0';
i++;
while(i < len && isdigit(str[i])) {
tempnum = tempnum * 10 + str[i] - '0';
i++;
}
if(n) tempnum = tempnum * (-1);
nums[ni++] = tempnum;
}
if(str[i] == ')') {
oi--;
ni--;
switch (operator[oi]) {
case 0:
nums[ni - 1] += nums[ni];
break;
case 1:
nums[ni - 1] -= nums[ni];
break;
case 2:
nums[ni - 1] *= nums[ni];
break;
case 3:
if(nums[ni] == 0) {
printf("error\n");
return 0;
} else {
nums[ni - 1] /= nums[ni];
break;
}
}
}
}
printf("%d", nums[0]);
return 0;
}