藍橋杯--演算法訓練 表示式計算
阿新 • • 發佈:2019-02-19
問題描述
輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。
輸入格式
輸入一行,包含一個表示式。
輸出格式
輸出這個表示式的值。
樣例輸入
1-2+3*(4-5)
樣例輸出
-4
資料規模和約定
表示式長度不超過100,表示式運算合法且運算過程都在int內進行。
atof函式講解:
標頭檔案:#include <stdlib.h>
函式 atof() 用於將字串轉換為雙精度浮點數(double),其原型為:
double atof (const char* str);
atof() 的名字來源於 ascii to floating point numbers 的縮寫,它會掃描引數str字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 isspace() 函式來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。引數str 字串可包含正負號、小數點或E(e)來表示指數部分,如123. 456 或123e-2。
【返回值】返回轉換後的浮點數;如果字串 str 不能被轉換為 double,那麼返回 0.0。
思路:根據符號的優先順序進行運算,本程式碼實現為定義兩個運算函式
函式 atof() 用於將字串轉換為雙精度浮點數(double),其原型為:
double atof (const char* str);
atof() 的名字來源於 ascii to floating point numbers 的縮寫,它會掃描引數str字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 isspace() 函式來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。引數str 字串可包含正負號、小數點或E(e)來表示指數部分,如123. 456 或123e-2。
【返回值】返回轉換後的浮點數;如果字串 str 不能被轉換為 double,那麼返回 0.0。
思路:根據符號的優先順序進行運算,本程式碼實現為定義兩個運算函式
include<cstdio> #include<stack> #include<string> #include<cstring> #include<cmath> #include<ctype.h> using namespace std; stack <char> sCh; //用於存放符號的符號棧 stack <double> sNum;//用於存放資料的資料棧 char num[105]; char str1[105]; void cal_1()//接受加減乘除 { double n1,n2; char ch; ch=sCh.top(); while(ch!='('){ n1=sNum.top(); sNum.pop(); n2=sNum.top(); sNum.pop(); switch(ch){ case '+': n2+=n1; break; case '-': n2-=n1; break; case '*': n2*=n1; break; case '/': n2/=n1; break; } sNum.push(n2);//將新的結果入棧 sCh.pop();//刪除用過的符號 ch=sCh.top(); } } void cal_2() { double n1,n2; char ch; ch=sCh.top(); while(ch =='*' || ch =='/'){ n1=sNum.top(); sNum.pop(); n2=sNum.top(); sNum.pop(); if(ch == '*'){ n2*=n1; }else if(ch == '/'){ n2/=n1; } sNum.push(n2); sCh.pop(); ch=sCh.top(); } } int main() { int k=0; double n; gets(str1); char c[2]="="; strcat(str1,c); sCh.push('(');//現將最低優先順序的左括號入棧 for(int i=0; str1[i]; ++i){ if(str1[i]>='0' && str1[i]<='9' || str1[i]=='.'){ num[k++]=str1[i]; continue; } num[k]=0;//在尾部新增字母用於atof函式讀取數字 注意這裡的數字0存到數組裡是字母‘a’可以理解為結束標誌 if(num[0]!=0){ n=atof(num); num[0]=0; sNum.push(n); } k=0; //下標歸零 switch(str1[i]){ case '+' : cal_1(); sCh.push('+'); break; case '-' : cal_1(); sCh.push('-'); break; case '*' : cal_2(); sCh.push('*'); break; case '/' : cal_2(); sCh.push('/'); break; case '(' : sCh.push(str1[i]); break; case ')' : cal_1(); sCh.pop(); break; case '=' : cal_1(); sCh.pop(); break; } } printf("%.0lf",sNum.top()); return 0; }