zoukankan      html  css  js  c++  java
  • 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;
        }
    }  
  • 相关阅读:
    中国的人生路上是紧跟领导就会有回报
    重游三峡广场有感
    假如你没有我
    关于中小型软件企业技术管理的建议(转)
    街客
    游歌乐山有感
    高成就者的反常思维
    漫谈创业和管理-程序员5大思维障碍 (转)
    QQ情缘
    javascript library
  • 原文地址:https://www.cnblogs.com/jack-Star/p/4034985.html
Copyright © 2011-2022 走看看