運算式求值
我的思路:先轉換成后綴運算式,再按后綴運算式的方法計算。
C++11
開O2
提交的代碼:
//匯入一大堆頭檔案
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<string>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<unistd.h>
#include<stack>
#include<queue>
#include<exception>
#include<vector>
using namespace std;
int main()
{ string in,x;//in是輸入的字串,x是用來做運算的字串。 stack<int>num;//數字堆疊,用來配合字串x做運算。 stack<char>op;//符號堆疊,只是中間部分,最終都要倒入做運算的字串x內。 cin>>in; for(int i=0;in[i]!='\0';i++){ if('0'<=in[i]&&in[i]<='9'){//是數字。 x+=in[i];//直接貼到字串。 if(!('0'<=in[i+1]&&in[i+1]<='9')){//假如后面沒有了數。
//那么就加上'.',因為我用'.'分割數字,后面才能根據'.'往數字堆疊里面填入十位數、百位數,否則的話,不知道到底是兩個數還是一個數,就會錯。(后面代碼自然會說明) x+='.'; } }else{ if(in[i]=='+'||in[i]=='-'){// if(!op.empty()){//如果堆疊沒空,才能進行后面計算。 if(op.top()=='*'||op.top()=='/'){//由于優先級的關系,乘號必須壓在加減號上面,加減號不能壓在乘號除號上面。 while(!op.empty()){//全部計算,清空站。 x+=op.top();//直接倒入x里面。 op.pop();//沒用了,扔垃圾桶里去。 x+='.';//我還是用'.'來隔開。 } //做完這一切后,會到后面的push。 } } op.push(in[i]);//push這個符號。 }else{ op.push(in[i]);//乘除號優先級最高,不用和加減號那樣判斷優先級。 } } } while(!op.empty()){//把堆疊清空。 x+=op.top(); op.pop(); x+='.'; }
// cout<<x<<endl; for(int i=0;x[i]!='\0';i++){//遍歷這個字串。 if('0'<=x[i]&&x[i]<='9'){//檢查到數字。 int kl=x[i++]-'0';//因為是字符,所以要減去'0',才能變成真正的數字。 while(x[i]!='.'){//一直到發現分隔符。 kl*=10;//把原來的數乘以10,因為這時候這個數的位數加1,后面要填入個位數。 kl+=x[i]-'0';//添加個位數。 i++;//移動索引到下一個位置。 } i--;//后面是i++,這里要--。 num.push(kl);//不要忘了把這個數添加到數字堆疊。 } if(x[i]=='+'||x[i]=='-'||x[i]=='*'||x[i]=='/'){//是運算子號。 int kl,a,b;//a是運算子前面的那個數,b是后面的,kl是結果。 if(num.size()<2){ cout<<"error"<<endl; return 0; } b=num.top();//由于是堆疊,要顛倒過來,堆疊頂的元素是后面的,后進先出。 num.pop(); a=num.top(); num.pop(); switch(x[i])//看看這個運算子,好做相應的運算。 { //加減乘都沒問題。 case '+':kl=a+b;break; case '-':kl=a-b;break; case '*':kl=a*b;break; //除法,要做判斷。 case '/'://這是除法。 if(b==0){//如果除數是0。 cout<<"error!"<<endl;//那么就是錯誤的,除數不能為0。 return 0;//后面的運算就不用管。 } kl=a/b;//判斷結束,可以正常運算。 break; } num.push(kl);//把結果入堆疊。 } } if(num.size()>=2||num.empty()){//數字和運算子不匹配,也是錯誤。 cout<<"error!"<<endl;//輸出錯誤。 return 0;//直接return。 } num.push(num.top()%10000);//題目要求只輸出后四位數。 cout<<num.top()<<endl;//輸出結果。 return 0;
} 這段代碼我自己給一個資料都可以過,但是卻只能過個測驗點,為什么?
uj5u.com熱心網友回復:
沒用過c++ 11轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/44581.html
標籤:疑難問題
上一篇:幫忙完善下儲存程序。。。。
