關於四則運算的解題思路在上資料結構課的時候期間明白了,只是一直沒有把它寫成代碼。
所以今天就把這個的題目的代碼寫出來了,也好為藍橋杯練練手。
例如:2+5*(2+7)/3-2.7/(3-2.1)=?
首先在讀取字元的時候,我們得到以下幾種情況。
用兩個棧分別來存符號和數字。
1、數字。(入數字棧,若符號棧不為空白,且棧頂元素為“乘”或者‘除’的時候,計算,直到棧頂元素為空白或棧頂元素不是“乘”或”除“。)
2、運算子。
乘、除、直接入符號棧。
加、減、若棧不空,且棧頂為加減符號,則進行計算,直到棧空或棧頂符號不是加減。(有可能出現正括弧)
3、括弧。
正括弧:直接入符號棧。
反括弧:若棧頂元素不為 “正括弧”,則一直計算。 計算完畢後, 若棧不空且棧頂元素為“乘”或者‘除’的時候,計算,直到棧頂元素為空白或棧頂元素不是“乘”或”除“。(主要是處理,同優先順序的情況先,從左開始計算。)
4、等號。(一直計算,直到符號棧為空白,輸出 結果。)
按照上面的思路,在出現等號之前,是處理了括弧的計算和乘除的計算。然
pS:計算的過程。(數字棧,前兩個棧頂元素出棧,符號棧,棧頂元素出棧。進行計算。)
計算 函數如下
void fun(){doubleb=Num.back(); Num.pop_back(); doublea=Num.back(); Num.pop_back(); char ch=ope.back(); ope.pop_back(); //算數符號 出棧 Num.push_back( calculate(a,ch,b) );}
用如下函數進行計算,a為棧頂的第二個數字,b為棧頂一個數字。不能弄反了,不然,對於減法和除法會計算出錯誤結果。
我先寫了一個calculate(double a,char ope ,double b); 計算a對b的運算給fun()調用。
double calculate(double a,char ope,double b){double result=0; switch(ope) { case '+': result=a+b; break; case '-': result=a-b; break; case '*': result=a*b; break; case '/': result=a/b; break; } return result;}
下面是main()函數。
int main(){ char str[100]; cin>>str; for(int i=0;strlen(str);i++) { if(str[i]=='='){ while(!ope.empty()) fun(); cout<<Num.back()<<endl; break; }else if(str[i]==')'){ //反括弧或等號,直接計算括弧內的運算 while(ope.back()!='(') fun(); ope.pop_back(); //正括弧 出棧 while(!ope.empty() && ( ope.back()=='*' || ope.back()=='/')) fun(); //計算乘除}else if(str[i]=='(' || str[i]=='*' || str[i]=='/' ) //正括弧、乘法、除法 入符號棧{ ope.push_back(str[i]);}else if( str[i]=='+' || str[i]=='-' ){ while(!ope.empty() && (ope.back()=='+' || ope.back()=='-')) fun(); ope.push_back(str[i]);}else //數字 入棧{ char ch[10],n=0,j=i; while(str[j]!='=' && str[j]!=')' && str[j]!='+' && str[j]!='-' && str[j]!='*' && str[j]!='/') { ch[n++]=str[j++]; } ch[n]='\0'; Num.push_back( atof(ch) ); while(!ope.empty() && ( ope.back()=='*' || ope.back()=='/')) fun(); i=j-1;} } return 0;}
以上就是解題代碼。 一些簡單的資料測試過了,如果有什麼資料過不了的,希望各位幫忙回複我。謝謝了。
大神直接忽略掉吧。。