函数嵌套 lisp表达式求值
问题 D: lisp表达式求值
时间限制: 1 Sec 内存限制: 128 MB
提交: 105 解决: 43
[提交][状态][讨论版]
题目描述
lisp是一种非常古老的计算机语言,是由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言,其语法如下:
(+ 2 3 4 5)
表示2+3+4+5,其值为14
(* 2 3 5)
表示2*3*5,其值为30
减法可以表示为:
(- 2 3 4)
表示:2-3-4=-5
即括弧中第一个符号为运算符,后面是操作数,改运算也可以嵌套,比如
(* (+ 2 3) 6)
表示先计算2+3=5,然后再5*6=30
麦卡锡当初提出了一套理论,其核心是一个eval函数,1958年年底,麦卡锡的一个学生史蒂夫•拉塞尔 看到了eval函数的定义,意识到如果把它翻译成机器语言,就可以把Lisp解释器做出来。这在当时是非常令人吃惊的事。麦卡锡后来回忆:拉塞尔对我说:“我想把eval编成程序……”我告诉他,别把理论和实践混淆,eval只是用来读的,不是用来做计算的。但是他执意要做,并且还真的做出来了。就是说,他把我论文中的eval编译成了[IBM] 704计算机的机器码,修正了bug,然后对外宣布做出了Lisp语言的一种解释器,这倒没有说错,确实如此。所以,从那个时候开始,Lisp语言就基本上是它现在的样子了……
现在,请你完成这个任务, 给出一个lisp表达式,计算出其结果
输入
一个lisp表达式
输出
该表达式的值
样例输入
样例输出
#include<stdio.h>
#include<string.h>
char s[],ch;
int n,k;
long dfs(int t,char c)
{
int i=,j,a[];
long ans;
while (s[k]!=')')
{
if (s[k]=='(')
{
k++;
while (s[k]==' ') k++;
ch=s[k];
i++;
a[i]=dfs(t+,ch);
}
else if (s[k]==' ') k++;
else if (s[k]>=''&&s[k]<='')
{
i++;
a[i]=s[k]-;
k++;
}
else k++;
}
ans=a[];
if (c=='+')
for (j=;j<=i;j++)
ans+=a[j];
if (c=='-')
for (j=;j<=i;j++)
ans-=a[j];
if (c=='*')
for (j=;j<=i;j++)
ans*=a[j];
if (c=='/')
for (j=;j<=i;j++)
ans/=a[j];
k++;
return ans;
} int main()
{
gets(s);
n=strlen(s);
k=;
while (s[k]!='(')
k++;
k++;
while (s[k]==' ')
k++;
ch=s[k];
printf("%ld\n",dfs(,ch));
return ;
}
函数嵌套 lisp表达式求值的更多相关文章
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值(河南省第四届ACM试题-C题)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定指定的一个由3种函数组成的表达式,计算其数值. [题目分析] 一开始以为是后缀表达式,后来抽了没想出来,最后用了递归的方法解 ...
- 第四届河南省ACM 表达式求值 栈
表达式求值 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...
- 河南省第四届ACM省赛(T3) 表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- Aviator 表达式求值引擎开源框架
简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...
- 【ACM】nyoj_305_表达式求值_201308081018
表达式求值时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20, ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
随机推荐
- [LeetCode]题解(python):121-Best Time to Buy and Sell Stock
题目来源: https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ 题意分析: 给定一个数组,代表array[i] 代表第i天的价 ...
- Cubieboard 关闭板载led
修改script.bin 找到最后节点[led_para] 修改leds_used = 0 script.bin 一般在系统盘的第一个分区 例如nand就在/dev/nanda sdcard就在/d ...
- IOS 定位服务与地图的应用开发
1.定位服务 现在的移动设备很多都提供定位服务,IOS设备提供3种不同定位途径: (1)WiFi定位,通过查询一个WiFi路由器的地理位置的信息,比较省电:IPhone,IPod touch和IPad ...
- Spring 基于注解的装配
xml头文件 xmlns:context="http://www.springframework.org/schema/context" 扫描包:<context:compo ...
- xbox360版本之分
2005-11-22 发售精简版 (Core):白色 / 无硬盘 / 主板代号 Xenon(现已停产) 2005-11-22 发售豪华版 (Premium):白色 / 20 GB 硬盘 / 主板代号 ...
- Linux批量重命名文件
五种方法实现Linux批量重命名文件 Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现. Linux批量重命名文件会涉及到改变一个字母.改 ...
- python Unicode转ascii码的一种方法
缘起 看到这样的数据:Marek Čech.Beniardá怎样变成相对应的ascii码呢 解决 import unicodedata s = u"Marek Čech" #(u表 ...
- ping的意思
Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最常用的命令.Ping向目标主机(地址)发送一个回送请求数据包,要求目标主机收到请求后给予答复,从而判断网络的响应时间和本机 ...
- 使用jsonEditor打造一个复杂json编辑器
最近研究一个web版的json编辑器,在github中搜索,发现了这个利器. https://github.com/jdorn/json-editor 几经研究,终于把该控件的大部分功能研究透彻. 发 ...
- c#程序添加其他网站的webservice引用。
前言: 有A网站,B网站两个网站独立运行.某一天,需要两个网站进行合作来完成一件事,比如用A网站接收一些数据进行处理,存入中转数据库,B网站定时去取数据进入自己的系统进行处理. 可能我们会先想到在B网 ...