本文共 1925 字,大约阅读时间需要 6 分钟。
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92 0
12178.21
*** 提示已隐藏,点击上方 [+] 可显示 ***
【思路】:
/********************************* * 日期: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#include #include #include 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 OP; stack 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); } } }//for printf("%.2f\n",Num.top()); }//while return 0;}
转载地址:http://jkcsi.baihongyu.com/