ブルーブリッジカップ--アルゴリズムトレーニング式計算


タイトルリンク:http://lx.lanqiao.cn/problem.page?gpid=T419
問題の説明
プラスとマイナスの乖離とかっこのみを含む合法的な式を入力し、式の値を求めます.このうち除算は、整除を表します.
入力フォーマット
式を含む行を入力します.
出力フォーマット
この式の値を出力します.
サンプル入力
1-2+3*(4-5)
サンプル出力
-4
データ規模と約定
式の長さは100を超えず、式の演算は合法的であり、演算プロセスはint内で行われる.
atof関数の説明:
ヘッダファイル:#include
関数atof()は、文字列を二重精度浮動小数点数(double)に変換するために使用され、そのプロトタイプは次のとおりです.
double atof (const char* str);
atof()の名前はascii to floating point numbersの略語に由来し、パラメータstr文字列をスキャンし、前の空白文字(スペース、tabインデントなど、isspace()関数で検出できる)をスキップし、数値または正負の記号に遭遇するまで変換を開始し、非数値または文字列の終了('0')に遭遇してから変換を終了し、結果を返します.パラメータstr文字列は、123.456または123 e−2のような指数部分を表すために、正負の番号、小数点またはE(e)を含むことができる.
【戻り値】変換後の浮動小数点数を返します.文字列strがdoubleに変換できない場合は、0.0を返します.
構想:シンボルの優先度に基づいて演算を行い、本コードは2つの演算関数を定義することを実現する
include
#include
#include
#include
#include
#include

using namespace std;

stack  sCh; //          
stack  sNum;//          
char num[105];
char str1[105];

void cal_1()//       
{
	double n1,n2;
	char ch;
	ch=sCh.top();
	while(ch!='('){
		n1=sNum.top();
		sNum.pop();
		n2=sNum.top();
		sNum.pop();
		switch(ch){
			case '+': 
				n2+=n1;
				break;
			case '-': 
				n2-=n1;
				break;
			case '*': 
				n2*=n1;
				break;
			case '/': 
				n2/=n1;
				break;
		}
		sNum.push(n2);//        
		sCh.pop();//        
		ch=sCh.top();
	}
}

void cal_2()
{
	double n1,n2;
	char ch;
	ch=sCh.top();
	while(ch =='*' || ch =='/'){
		n1=sNum.top();
		sNum.pop();
		n2=sNum.top();
		sNum.pop();
		if(ch == '*'){
			n2*=n1;
		}else if(ch == '/'){
			n2/=n1;
		}
		sNum.push(n2);
		sCh.pop();
		ch=sCh.top();
	}
	
}
int main()
{
	int k=0;
	double n;
	gets(str1);
	char c[2]="=";
	strcat(str1,c);
	sCh.push('(');//              
	for(int i=0; str1[i]; ++i){
		if(str1[i]>='0' && str1[i]<='9' || str1[i]=='.'){
			num[k++]=str1[i];
			continue;
		}
		num[k]=0;//         atof              0        ‘a’          
		if(num[0]!=0){
			n=atof(num);
			num[0]=0;
			sNum.push(n);
		}
		k=0; //     
		switch(str1[i]){
			case '+' :
				cal_1();
				sCh.push('+');
				break;
			case '-' :
				cal_1();
				sCh.push('-');
				break;
			case '*' :
				cal_2();
				sCh.push('*');
				break;
			case '/' :
				cal_2();
				sCh.push('/');
				break;
			case '(' :
				sCh.push(str1[i]);
				break;
			case ')' :
				cal_1();
				sCh.pop();
				break;
			case '=' :
				cal_1();
				sCh.pop();
				break;
			
		}
	}
	printf("%.0lf",sNum.top());
	return 0;
}