簡易計算機HDU 1237
簡易電卓Time Limit:2000/1000 MS(Java/others)Memory Limit:65536/32768 K(Java/others)Total Submission(s):14384 Accepted Submission(s):4861
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
1 + 2 4 + 2 * 5 - 7/11 0
Sample Output
3.00 13.36
構想:文字列は1行のデータを読み込む;1、文字列の末尾から逆さまにデータをそれぞれデジタルスタックとオペレータスタックに押し込む(10進数変換時のデータの処理に注意、逆さまに読むので少し面倒です.)2、1つのオペレータと2つのオペレータを取り出す3、比較的に取り出すオペレータとスタックの一番上のオペレータの優先度、取り出すオペレータが大きいと、演算子は、結果をデジタルスタックに戻す.4、スタックトップのオペレータの優先度が大きい場合、オペレータスタックトップオペレータとデジタルスタックトップのデータを取り出し、まず2番目のオペレータを演算し、結果をデータスタックに戻し、最初の操作数とオペレータをそれぞれデータと操作スタックに戻す.5.スタックが空になるまで、上記2、3、4の手順を繰り返します.結果を出力します.
最初はずっとwaで、他の人のコードを见るのが长すぎて、第1版のコードは长く干して、昨日出して10進数の処理の过程を直して、データのタイプをdoubleに変えて、ついにACになりました.の
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
1 + 2 4 + 2 * 5 - 7/11 0
Sample Output
3.00 13.36
構想:文字列は1行のデータを読み込む;1、文字列の末尾から逆さまにデータをそれぞれデジタルスタックとオペレータスタックに押し込む(10進数変換時のデータの処理に注意、逆さまに読むので少し面倒です.)2、1つのオペレータと2つのオペレータを取り出す3、比較的に取り出すオペレータとスタックの一番上のオペレータの優先度、取り出すオペレータが大きいと、演算子は、結果をデジタルスタックに戻す.4、スタックトップのオペレータの優先度が大きい場合、オペレータスタックトップオペレータとデジタルスタックトップのデータを取り出し、まず2番目のオペレータを演算し、結果をデータスタックに戻し、最初の操作数とオペレータをそれぞれデータと操作スタックに戻す.5.スタックが空になるまで、上記2、3、4の手順を繰り返します.結果を出力します.
最初はずっとwaで、他の人のコードを见るのが长すぎて、第1版のコードは长く干して、昨日出して10進数の処理の过程を直して、データのタイプをdoubleに変えて、ついにACになりました.の
/* bug—— 00000... 0, * , 。。。 */
#include <iostream>
#include <stack>
#include <string.h>
#include <cstdio>
using namespace std;
char inputs[201];
int judge(char c)
//
{
if(c >= '0' && c <= '9') return 1;
else if(c == '+' || c == '-') return 2;
// ,
else if(c == '*' || c =='/' ) return 3;
else return 0;
}
double cacul(double i,char c,double j)
//
{
double sum;
switch (c)
{
case '+':
sum = i + j;
break;
case '-':
sum = i - j;
break;
case '*':
sum = i * j;
break;
case '/':
sum = i / j;
break;
}
return sum;
}
int main()
{
double sum = 0,n1,n2,n3;
// double ,float , float WA
char op1,op2;
int len,i,j,flag,k;
gets(inputs);
len = strlen(inputs);
while(len != 1 || inputs[0] != '0')
{
j =0;
i = len;
stack<char> stOperator;
stack<double> stNumber;
flag = k = 0;
//flag ,k
while(i >= 0)
// ,
{
if(judge(inputs[i]) == 1)
// ,
{
int l = inputs[i] - '0';
for(j = 0;j < flag;j++)
// , ,
l = l * 10;
k += l;
flag++;
}
else if(judge(inputs[i]) >= 2)// ,
{
stNumber.push(k);
//
flag = 0;
// 0
stOperator.push(inputs[i]);
//
k = 0;
}
i--;
}
stNumber.push(k);
//
while(!stNumber.empty() && !stOperator.empty())
// ,
{
op1 = stOperator.top();
stOperator.pop();
//
if(!stOperator.empty())op2 = stOperator.top();
//
else op2 ='\0';
// op2
n1 = stNumber.top();
stNumber.pop();
//
n2 = stNumber.top();
stNumber.pop();
//
if( judge(op2) > judge(op1))
//
{
n3 = stNumber.top();
stNumber.pop();
//
sum = cacul(n2,op2,n3);
//
stNumber.push(sum);
//
stNumber.push(n1);
//
stOperator.pop();
// ,
stOperator.push(op1);
//
}
else//
{
sum = cacul(n1,op1,n2);
//
stNumber.push(sum);
//
}
}
printf("%.2f
",sum);
gets(inputs);
len = strlen(inputs);
}
return 0;
}