1. 程式人生 > 其它 >hdu1237 簡單計算器 (棧,程式碼比較繁瑣,不過不難理解)

hdu1237 簡單計算器 (棧,程式碼比較繁瑣,不過不難理解)

技術標籤:字串c++

本人新手,程式碼比較笨,不過不難理解

#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;
}