hdu1237 簡單計算器 (棧,程式碼比較繁瑣,不過不難理解)
阿新 • • 發佈:2021-01-28
本人新手,程式碼比較笨,不過不難理解 #include<iostream> #include<cstdio> #include<stack> using namespace std; double pow(int a,double b){ double res=b; for(int i=0;i<a;i++) res*=10; return res; } int main(){ string s; while(getline(cin,s)){ if(s=="0") break; s+="?"; //直接加一個沒用的’?‘,後面就不用判斷是否越界了 int flag=0;double ans=0.0; stack<double> cal; for(int i=0;i<s.length();i++){ //從頭開始讀字串 if(s[i]==' ' || s[i]=='+') continue; //如果是空格或加號直接跳過 else if(s[i]>='0' && s[i]<='9'){ //遇到數字就判斷有幾位數 double tmp=0.0;int wei=0; while(s[i]>='0' &&s[i]<='9'){ //如果前面沒加'?',這裡字串末尾會越界,導致s[i]不存在 cal.push(s[i++]-'0');wei++; //每個數字暫存到棧中,wei記錄數字個數 } for(int j=0;j<wei;j++) {tmp+=pow(j,cal.top()); cal.pop();} //取出棧頂元素wei次,用自己寫的pow函式計算 if(flag==0) cal.push(tmp); //將最後計算結果壓棧 else {cal.push(-tmp);flag=0;} //若flag為1代表該數為負數,將-tmp壓棧,壓棧後記得將flag=0 } else if(s[i]=='-') {flag=1;} //下一個數字是負數 else if(s[i]=='*' || s[i]=='/') { //如果是乘號或除號則跟加號一樣往後找數字,然後再跟棧頂元素相乘/除 char c=s[i]; double tmp=0.0,top;int wei=0; i+=2; //i+1是空格不用管 while(s[i]>='0' &&s[i]<='9'){ cal.push(s[i++]-'0');wei++; } for(int j=0;j<wei;j++) {tmp+=pow(j,cal.top());cal.pop();} top=cal.top();cal.pop(); if(c=='*'){top=top*tmp;cal.push(top);} else if(c=='/'){top=top/tmp;cal.push(top);} } } while(cal.size()) {ans+=cal.top();cal.pop();} //最後將棧內所有元素相加即得答案 printf("%.2lf\n",ans); } return 0; }