首页 > 代码库 > lisp的解释器

lisp的解释器

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程序设计竞赛

#include <iostream>#include <stack>#include <string.h>#include <stdlib.h>using namespace std;int main(){    char  str [10000];    int count;    cin>>count;    cin.getline(str,200);    int t=count;    while(t--){        stack<double> Num;        stack<char> Op;        cin.getline(str,10000);        int len =strlen(str);//<string.h>        int sum=0;        for (int i = 0; i <len; i++)           {              char temp=str[i];            if (temp==()            {                Op.push(temp);            }            if (temp==+||temp==-||temp==*||temp==/)                         {                Op.push(temp);            }            if (temp==))            {                int c=Num.top();                Num.pop();                int b=Num.top();                Num.pop();                char Temp_Op=Op.top();                if (Temp_Op==+)                {                    sum=b+c;                    Op.pop();                }                if (Temp_Op==-)                {                    sum=b-c;                    Op.pop();                }                if (Temp_Op==*)                {                    sum=b*c;                    Op.pop();                }                if (Temp_Op==/)                {                    sum=b/c;                    Op.pop();                }                Op.pop();                Num.push(sum);            }            if (isdigit(temp))            {                int temp_num=atoi(&str[i]);  //<stdlib.h>                while(i<len && isdigit(str[i]))                {                    i++;                }                i--;                Num.push(temp_num);            }        }        cout<<"Case #"<<count-t<<": "<<Num.top()<<endl;    }}  

 

lisp的解释器