【棧/中綴轉字尾】HDU1237簡單計算器
阿新 • • 發佈:2018-12-30
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1237
#include<bits/stdc++.h> using namespace std; int Priority(char op) { if(op=='#') return 0; if (op=='+' || op=='-') return 1; if (op=='*' || op=='/') return 2; else return -1; } double Operate(double x,double y,char op) { if (op=='+') return x+y; if (op=='-') return x-y; if (op=='*') return x*y; if (op=='/') return x/y; else return -1; } void cal(string s) { double num=0; stack<double>numSt; // 數字棧; stack<char>charSt; // 符號棧; for(int i=0;i<s.size();i++){ if(s[i]==' ') continue; if(isdigit(s[i])){ num=0; while(isdigit(s[i])||s[i]=='.'){ num=num*10+s[i]-'0'; i++; } numSt.push(num); }else{ while(!charSt.empty()&&Priority(charSt.top())>=Priority(s[i])){ double y=numSt.top(); numSt.pop(); double x=numSt.top(); numSt.pop(); char op=charSt.top(); charSt.pop(); numSt.push(Operate(x,y,op)); } charSt.push(s[i]); } } while(!charSt.empty()){ double y=numSt.top(); numSt.pop(); double x=numSt.top(); numSt.pop(); char op=charSt.top(); charSt.pop(); numSt.push(Operate(x,y,op)); } printf("%.2lf\n",numSt.top()); return; } int main() { string s; while(getline(cin,s)&&(s[0]!='0'||s.size()!=1)){ cal(s); } return 0; }