四則運算的解題報告

來源:互聯網
上載者:User

   關於四則運算的解題思路在上資料結構課的時候期間明白了,只是一直沒有把它寫成代碼。 

   所以今天就把這個的題目的代碼寫出來了,也好為藍橋杯練練手。

  例如: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;}

以上就是解題代碼。 一些簡單的資料測試過了,如果有什麼資料過不了的,希望各位幫忙回複我。謝謝了。

 大神直接忽略掉吧。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.