1 /************************************************************** 2 作者:陈新 3 邮箱:cx2pirate@gmail.com 4 用途:hdu1237 5 时间:2014.3.4 23:17 6 编译环境 : g++ 7 数据:10308543 2014-03-15 20:45:36 Accepted 1237 140MS 424K 1948 B G++ 超级旅行者 8 *************************************************************/ 9 10 #include <iostream> 11 #include <stack> 12 #include <iomanip> 13 14 using namespace std; 15 16 typedef struct{ 17 stack<double> nums; 18 char op; 19 }EXPRESSION; 20 21 bool endingCheck(); 22 double caculate(double firstNum,double secondNum,char op); 23 void caculateExpression(EXPRESSION * pExpr); 24 25 int main(){ 26 EXPRESSION expr; 27 double firstNum = 0; 28 while(cin >> firstNum){ 29 if(endingCheck()) 30 { 31 if(firstNum != 0){ 32 cout << fixed << setprecision(2) << firstNum << endl; 33 continue; 34 } 35 else{ 36 break; 37 } 38 } 39 else{ 40 expr.nums.push(firstNum); 41 } 42 43 char op; 44 while(op = cin.get()){ 45 double thirdNum; 46 cin >> thirdNum; 47 if(op == '+' || op == '-'){ 48 caculateExpression(&expr); 49 expr.nums.push(thirdNum); 50 expr.op = op; 51 } 52 else{ 53 double secondNum = expr.nums.top(); 54 expr.nums.pop(); 55 expr.nums.push(caculate(secondNum,thirdNum,op)); 56 } 57 if(endingCheck()){ 58 caculateExpression(&expr); 59 break; 60 } 61 } 62 63 cout << fixed << setprecision(2) << expr.nums.top() << endl; 64 expr.nums.pop(); 65 } 66 return 1; 67 } 68 69 bool endingCheck(){ 70 return cin.get() == '\n'; 71 } 72 73 double caculate(double firstNum,double secondNum,char op){ 74 if(op == '+'){ 75 return firstNum + secondNum; 76 } 77 else if(op == '-'){ 78 return firstNum - secondNum; 79 } 80 else if(op == '*'){ 81 return firstNum * secondNum; 82 } 83 else if(op == '/'){ 84 return firstNum / secondNum; 85 } 86 } 87 88 void caculateExpression(EXPRESSION * pExpr){ 89 if(pExpr ->nums.size() == 1){ 90 return; 91 } 92 else{ 93 double secondNum = pExpr ->nums.top(); 94 pExpr ->nums.pop(); 95 double firstNum = pExpr ->nums.top(); 96 pExpr ->nums.pop(); 97 pExpr ->nums.push(caculate(firstNum,secondNum,pExpr ->op)); 98 } 99 }