1. 程式人生 > >【棧/中綴轉字尾】HDU1237簡單計算器

【棧/中綴轉字尾】HDU1237簡單計算器

題目連結: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;
}