ブルーブリッジカップ--アルゴリズムトレーニング式計算
2812 ワード
タイトルリンク: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つの演算関数を定義することを実現する
問題の説明
プラスとマイナスの乖離とかっこのみを含む合法的な式を入力し、式の値を求めます.このうち除算は、整除を表します.
入力フォーマット
式を含む行を入力します.
出力フォーマット
この式の値を出力します.
サンプル入力
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;
}