令人抓狂的四则运算
題
曾記否,我們小學時,遇到這種四則運算,心情是抓狂的:
輸入格式:
輸入由若干行組成:
除最后一行之外,每一行是一個長度不超過80的四則運算表達式
最后一行,是一個=字符
輸入的所有字符均為英文半角字符,題目保證給定的表達式是正確的,不需要做有效性檢查,題目保證所有運算數的長度(含小數點)均不超過5位,運算的中間結果和最終結果的絕對值均不超過100000
輸出格式:
對輸入的每個表達式,在一行中給出運算結果,保留1位小數。
輸入樣例:
1
1+2
3-3.8
1.32*(4+(-2))
=
輸出樣例:
1.0
3.0
-0.8
2.6
代碼
#include <math.h> #include <iostream> #include <stack>//棧 #include <stdio.h> using namespace std; bool shuzi(char a) {return (a <= '9' && a >= '0')||(a=='.');//判斷字符串中的字符是不是數字 } int fd(char a) {//判斷優先級if (a == '*' || a == '/')return 3;else if (a == '+' || a == '-')return 2;else if (a == '@')return -1;else if (a == '(')return 1;else if (a == ')')return 4; } double cla(double a, double b, char chart) {switch (chart){case '*':return a * b;case '/':return a / b;case '+':return a + b;case '-':return a - b;default:break;} } double claee(string instr) { //先將運算式子轉化成后綴表達式,將數據兩端將加上# //遇到數字直接轉化,遇到運算符需要判斷優先順序stack<char> ops;//放置運算符的棧,棧底放置@ops.push('@');string hstr = "";//初始化//hstr儲存后綴表達式int n = instr.length();int t=0;for (int i = 0; i < n; i++){//1+(-2)負號要和2在一起,-2+1負號要和2在一起,2-(+7)正號要和7在一起if((i==0&&(instr[i]=='+'||instr[i]=='-'))||((!shuzi(instr[i - 1]))&&(!shuzi(instr[i]))&&instr[i-1]!=')'&&instr[i]!='('&&instr[i]!=')')){hstr += '#';hstr += instr[i];t=1;//標記此時我們確定的數字前面已經加了#}else if (shuzi(instr[i])){//添加數字前的#if(i==0)hstr += '#';if (i > 0 && !shuzi(instr[i - 1])&&t==0)hstr += '#';//直接加入后綴表達式中hstr += instr[i];t=0;//添加數字后的#if (i < n-1 && !shuzi(instr[i + 1]))hstr += '#';if (i == n - 1)hstr += '#';}else{if (instr[i] == '(')ops.push(instr[i]);else if (instr[i] == ')'){while (ops.top() != '(')//把'('后的運算符放進后綴表達式里{hstr += ops.top();ops.pop();}ops.pop();}else{while (fd(instr[i]) <= fd(ops.top()))//棧頂要放整個棧中最高級的運算符(有且只有一個){hstr += ops.top();//把要比instr[i]高級或同等級的運算符放進后最表達式里,ops.pop();//然后在棧中刪掉他}ops.push(instr[i]);}}}while (ops.top() != '@'){hstr += ops.top();ops.pop();}//如 1.32*(4+(-2)) 在hstr中: #1.32##4##-2#+*--->1.32*(4+(-2)),棧后入先出先-2 和 4相加int n2 = hstr.length();int i = 0;int k=0,u=0;bool isd = false;double num = 0;stack<double> stn;while (i < n2){if (hstr[i] == '#'){if (isd) //遇到數字的后一個#{k=0;if(u)num=0-num;u=0;stn.push(num);num = 0;isd = false;}else isd = true;//遇到數字的前一個#}else if(isd&&(!shuzi(hstr[i]))){if(hstr[i]=='-')//有可能遇到'-',如#-2#,如果是'+',不用管,不影響答案,判斷一下u=1;}else if (shuzi(hstr[i])){if(hstr[i]=='.')//判斷是否為小數{k=1;i++;continue;}if(!k)//整數部分{num *= 10;num += (hstr[i] - '0');}else//小數部分{num+=(double)(hstr[i] - '0')/(1.0*pow(10,k));k++;}}else//遇到運算符進來{double a = stn.top();//棧,后入先出 stn.pop();double b = stn.top();stn.pop();double temp = cla(b, a, hstr[i]);stn.push(temp);}i++;}double ans = stn.top();return ans; } int main() {string instr;while (cin>>instr){if(instr=="=")break;double sum=claee(instr);printf("%.1lf\n",sum);}return 0; }總結
- 上一篇: 想装一台自己的电脑,可以先了解下这些问题
- 下一篇: 提升思维能力,至慧学堂有妙招