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

你可能感兴趣的:(算法,递归,ACM,lisp,BJTU)