lisp的解释器
Time Limit: 2000 MS Memory Limit: 65535 Kb |
Total Submission: 22 Accepted: 8 |
Description
XXC小童鞋对lisp非常感兴趣,不过lisp是一个比较小众的黑客语言,因为它采用了一种不太容易理解的表达方式——S表达式。
S表达式形式如下:
(Operation A B……)
其中Operation是操作符,A、B等是操作数(操作数的数量根据操作符而定),A、B等可以是直接的数,也可以是其他S表达式。算式的结果为A (Operation) B.例如(+ 1 2)=3.
现在XXC童鞋希望你为他做一个简化版的lisp解释器,可以处理基本的四则二元运算。
现在XXC童鞋希望你为他做一个简化版的lisp解释器,可以处理基本的四则二元运算。
Input
第一行包含一个整数N,代表用例个数。(N≤100)
接下来的N行每行包含一个用例,每一个用例包含一个lisp表达式,涉及四种二元操作符(+、-,*,/),嵌套层数不超过200。
善良的XXC童鞋希望解释器可以简单一点,所以在S表达式中,每个操作数都是整数类型。(注意到整数除法中,7/2=3.)
数据保证不会出现除0,不会超出int的范围
Output
对于给定的表达式,请给出其计算后的结果,形如“Case #id: result”
Sample Input
3
(+ 1 2)
(/ 1 3)
(/ 6 (+ 1 2))
Sample Output
Case #1: 3
Case #2: 0
Case #3: 2
Source
第八届北京交通大学ACM程序设计竞赛
解题思路: 题目原型应该是逆波兰表达式,也是一道北大百炼题目,主要是采用递归的方法解决,采用递归运算的方式,代码会比较简洁。
辅助工具: atoi函数。
atoi函数
原型:intatoi( const char *string );
ASCIIto integer
作用:将字符串转为integer类型
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int cal()
{
char s[10];
scanf("%s",s);
switch(s[0])
{
case '+': return cal() + cal();
case '-': return cal() - cal();
case '/': return cal() / cal();
case '*': return cal() * cal();
case '(':
{
switch(s[1])
{
case '+': return cal() + cal();
case '-': return cal() - cal();
case '/': return cal() / cal();
case '*': return cal() * cal();
default: return atoi(s);
}
}
default: return atoi(s);
}
}
int main()
{
freopen("test.txt","r",stdin);
int t,i;
scanf("%d",&t);
for(i=1;i<=t;i++){
int ans = cal();
printf("Case #%d: %d\n",i,ans);
}
return 0;
}