式の値を求める(データ構造)

3500 ワード

説明
明さんは計算機を作りたいですが、彼がやるのはA+Bの計算機だけではないです.彼は自由に式を入力してもその値を求めることができる計算機を実現したいです.彼を助けてこの計算機を実現してください.
例えば、入力:「1+2/4=」で、プログラムは1.50を出力します.(結果は2桁の小数を保持します.)
入力
1行目は整数nを入力し、n組のテストデータ(n<10)があります.
各テストデータは1行のみで、長さが1000を超えない文字列です.この演算式を表します.各演算式は「=」で終了します.この表式には+-*/と小かっこという記号しか含まれていません.小かっこは入れ子で使用できます.データは入力の操作数に負の数がないことを保証します.
データは、除数が0にならないことを保証します.
出力
各グループはこの演算式の演算結果を出力し、出力結果は2桁の小数を保持します.
サンプル入力
2
1.000+2/4=
((1+2)*5+1)/4=
サンプル出力
1.50
4.00
//考え方:私達が計算する時は、一般的には中綴り式を使います.計算機はサフィックス式を使います.この問題は演算式を/サフィックス式に変えてから、サフィックス式をスタックに入ればいいです.
//第一歩:文字列を作成し、数字を保存し、文字スタックを作成し、記号を保存し、最後に中綴り式をキューに置く 
//第二部:浮動小数点型スタックを作成します.中綴り表現に注意してください.拡張式に変換するときは、数字記号の間にスペースがあります. 
ヽoo.ツ
ヽoo.ツ
ヽoo.ツ
ヽoo.ツ
ヽoo.ツ
ヽoo.ツ
using namespace std;
queue q
stack s;
stack s 1;
char a[1000]
char str[1000];
//加減乗除、接尾式の2つのスタックのトップ要素を演算してスタックから削除し、結果をスタックに保存します. 
int oper(char ch){
if(ch='+''|ch='-')
return 1;
}else if(ch='*'124 ch='/')
return 2;

return 0;
)
void acl cuu 1(){
double x=s 1.top()
s 1.pop()
double y=s 1.top()
s 1.pop()
double c=y+x;
//printf(「%lf%lf%lf」、y、x、c)
s 1.push(c)
)
void aclcuu 2(){
double x=s 1.top()
s 1.pop()
double y=s 1.top()
s 1.pop()
double c=y-x;
//printf(「%lf%lf%lf」、y、x、c)
s 1.push(c)
)
void aclcuu 3(){
double x=s 1.top()
s 1.pop()
double y=s 1.top()
s 1.pop()
double c=y*x;
//printf(「%lf%lf%lf」、y、x、c)
s 1.push(c)
)
void aclcuu 4(){
double x=s 1.top()
s 1.pop()
double y=s 1.top()
s 1.pop()
double c=y/x;
//printf(「%lf%lf%lf」、y、x、c)
s 1.push(c)
)
int main(){
int n,i
double ans; 
scanf("%d"、&n);
getar();
while(n-){
scanf("%s",a)
int len=strelen(a);
//サフィックス表現をサフィックス表現にして、キューに置く 
for(i=0;i<len-1;i+){
if(a[i]='0'&a[i]<='9')
q.push(a[i])
contine;
)
else if(a[i]='){
q.push(a[i])

else if(a[i]='(')
s.push(a[i])
)
else if(s.empty(){
s.push(a[i])
q.push(');
)
else if(a[i]=')
while(s.top()='(')
q.push(');
q.push(s.top();
s.pop()
)
s.pop()
)
else if(oper(a[i]>oper(s.top()))
s.push(a[i])
q.push(');
)
else{
while(!s.empty()&oper(a[i])<=oper(s.top())
q.push(');
q.push(s.top();
s.pop()
)
s.push(a[i])
q.push(');
)
)
while(!s.empty(){
q.push(');
q.push(s.top();
s.pop()
) //すべての文字数をサフィックス形式でキューに保存しました.
//キューの要素を浮動小数点型スタックに入れる 
int k=0
while(!q.empty(){
if(q.front()='0'&q.front(='9'|q.front()='.')
str[k+]=q.front()
q.pop()
contine;
}else if(q.front()=')
k=0;
q.pop()
)
if(str[0]!=0){
ans=at of(str) //文字列を浮動小数点に変換します. 
memset; //文字列を空にします 
//str[0]=0
s 1.push(ans) 
contine;
)
switch(q.front(){
case'+':
aclcu_1();
q.pop()
break;
case'-':
acl cuu 2();
q.pop()
break;
case'*':
aclcu_3();
q.pop()
break;
case'/':
aclcu_4()
q.pop()
break;
)
)
printf("%2 lf",s 1.top();
s 1.pop()
)
return 0;
)