式の解

3739 ワード

式の演算結果を計算する
C++アクセサリスタックオブジェクトを使用して実装
入力
最初の入力tは、t個のインスタンスがあることを示す
2行目から、各行に1つの式を入力し、各式の末尾に#を付けて終了を表します.
t行入力
 
しゅつりょく
行ごとに式の計算結果が出力され、計算結果は浮動小数点数(4桁の小数を含む)の形式で表されます.
coutで浮動小数点数出力の小数点数を制御するには、ライブラリファイルを追加し、fixed関数とsetprecision関数を使用します.コードは次のとおりです.
#include #include using namespace std;
int main()
{ double temp = 12.34
cout<
}
出力結果は12.3400
 
サンプル入力
2
1+2*3-4/5#
(66+(((11+22)*2-33)/3+6)*2)-45.6789#
サンプル出力
6.2000
54.3211
この問題は、2つのスタック(式スタック、デジタルスタック)で実現されます.
 
#include
using namespace std;
// >....1
// <....2>   
// >t;
    while(t--)
    {
        temp=0;
        flag=0;
        start=0;
        cin>>expression;
        stack op_num;
        stack op;
        op.push('#');
        len = expression.length();
        for(i=0;i='0'&&ch<='9'||ch=='.')&&flag==0)
            {
                start=i-temp;
                flag=1;
            }
            else if((ch'9')&&ch!='.')
            {
                if(ch=='(')
                {
                    op.push(ch);
                    continue;
                }
                if(ch=='-'&&expression[i-1]=='(') 
                {
                    temp=1;
                    continue;
                }
                if(flag==1)
                {
                    stringstream ss(expression.substr(start,i-start));
                    ss>>num;
                    op_num.push(num);
                    flag=0; 
                    temp=0;
                }
                r_op=get_num(op.top());//    
                l_op=get_num(ch);//    
                if(priority[l_op][r_op]==1)
                {
                    op.push(ch);
                 } 
                else if(priority[l_op][r_op]==2)
                {
                    while(1)
                    {   
                        b=op_num.top();
                        op_num.pop();
                        a=op_num.top();
                        op_num.pop();
                        type=op.top();
                        op.pop();
                        if(ch==')')
                        {
                            if(op.top()=='(')
                            {
                                op.pop();
                                //ch=')'
                                ch='#'; 
                                l_op=get_num(ch);
                            }
                        }   
                        c=calculate(a,b,type);
                        op_num.push(c);
                        if(priority[l_op][get_num(op.top())]!=2)
                            break;
                    }
                    if(ch!=')'&&ch!='#')
                        op.push(ch);
                     
                }
                else if(priority[l_op][r_op]==0)
                {
                    while(op.top()!='#')
                    {
                        b=op_num.top();
                        op_num.pop();
                        a=op_num.top();
                        op_num.pop();
                        c=calculate(a,b,op.top());
                        op_num.push(c);
                        op.pop();
                    }
                    printf("%.4lf
",op_num.top()); op_num.pop(); op.pop(); } } } } return 0; }