读书人

标题1100: 简单计算器

发布时间: 2013-03-21 10:08:17 作者: rapoo

题目1100: 简单计算器
题目描述

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。


输入

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。


输出

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。


样例输入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0


样例输出
12178.21


提示 [+]

*** 提示已隐藏,点击上方 [+] 可显示 ***


来源

2006年浙江大学计算机及软件工程研究生机试真题

【思路】:

标题1100: 简单计算器

/*********************************  *    日期:2013-3-15 *    作者:SJF0115  *    题号: 天勤OJ 题目1100: 简单计算器 *    来源:http://www.acmclub.com/problem.php?id=1100(http://acm.hdu.edu.cn/showproblem.php?pid=1237) *    结果:AC  *    来源:2006年浙江大学计算机及软件工程研究生机试真题 *    总结: **********************************/#include<stdio.h>#include<iostream>#include<stack>#include<string.h>using namespace std;//算符优先级char Precede(char c1,char c2){switch(c1){case '+':case '-':if(c2 == '*' || c2 == '/'){return '<';}else{return '>';}break;case '*':case '/':return '>';break;case '#':return '<';break;}}//运算double Operate(double a,double b,char c){switch(c){case '+':return a + b;break;case '-':return a - b;break;case '*':return a * b;break;case '/':return a / b;break;}}int main(){int i,len,n;char str[1001];    while(gets(str) && strcmp(str,"0") != 0){stack<char> OP;stack<double> Num;//#作为栈底元素OP.push('#');len = strlen(str);//输入串要以'#'开始和结束str[len] = '#';n = 0;for(i = 0;i <  len || OP.top() != '#';){//跳过空格if(str[i] == ' '){i++;}//数字else if(str[i] >= '0' && str[i] <= '9'){//提取运算数while(str[i] >= '0' && str[i] <= '9'){n = n * 10 + str[i] - '0';i++;}//数字入栈Num.push(n);n = 0;}//运算符else{//如果栈顶元素小,则把运算符压入栈if(Precede(OP.top(),str[i]) == '<'){OP.push(str[i]);i++;}//如果栈顶元素大,则弹出栈顶运算符,再从数字栈弹出两个栈顶数字,完成运算,再把运算结果压入栈。else if(Precede(OP.top(),str[i]) == '>'){double b = Num.top();Num.pop();double a = Num.top();Num.pop();char c = OP.top();OP.pop();double result = Operate(a,b,c);Num.push(result);}}}//forprintf("%.2f\n",Num.top());}//whilereturn 0;}


读书人网 >编程

热点推荐