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; } }
时间: 2024-09-27 05:43:31