BJTU 1687 lisp的解释器

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解释器,可以处理基本的四则二元运算。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值