C ++エクササイズ|ベース中置算術式の評価スタック(ダブルタイプ

書式#include <iostreamの> 
の#include <スタック> 
の#include <cmath>
 使用して 名前空間はstd;
char型のCH; 

ブール F(チャーT)
{ 
    もし(T == ' + ' || T == ' - ' || T == ' * ' || T == ' / ' || T == ' ' || T == ' ' || T == ' = ' リターン 1 リターン 0 ;
}

ダブル CAL(二重 T1、二重 T2、チャーC)
{ 
    スイッチ(C)
    { 
        ケース ' + 'リターン T1 + T2。
        ケース - 返さ T1〜T2を。
        ケース ' * 'リターンのT1 *のT2;
        ケース ' / 'リターン T1 / T2。
    } 
    戻り 0 
} 

int型CMP(チャー T1、チャーT2)
{ 
    int型、Q1 = 0、Q2 = 0 スイッチ(T1)
    { 
        ケース ' + ':Q1 = 1破ります;
        ケース ' - ':Q1 = 1破ります;
        ケース ' * ':Q1 = 2 ; 破ります;
        ケース ' / ':Q1 = 2破ります;
        ケース " ":Q1 = 0 ; 破ります;
        ケース ' ':Q1 = - 1破ります; 
    } 
    スイッチ(T2)
    { 
        ケース ' + ':Q2 = 1破ります;
        ケース ' - ':Q2 = 1破ります;
        ケース ' * ':Q2 = 2 ; 破ります;
        ケース ' / ':Q2 = 2ブレーク;
        ケース ' ':Q2 = 0 ; 破る;
         ケース ' ':Q2 = - 1破ります; 
    } 
    であれば(Q1 == - 1 && Q2 == 0 戻り 0 ;
    もし(Q1> Q2)
         リターン 2 もし(Q1 <= Q2)
         リターン 1 戻る - 1 
} 

二重Z()
{
    ダブルのANS = 0 ;
    INT [ 1000年 ]、I = 0、フラグ= 0 
    [ ++ i]は= CH- ' 0 ' 一方、(CIN >> CH &&!F(CH))
    { 
        場合(CH == ' ' 
        { 
            フラグ = I。
            続け; 
        } 
        [ ++ I] = CH- ' 0 ' 
    } であれば(フラグ== 0 
        フラグ =
    私;
    INTの J = 1 ; J <= I; J ++ 
    { 
        ANS + = [J] * POW(10、FLAG- J)。
    } 
    戻りANS。
} 

int型のmain()
{ 
    スタック < ダブル > OPND。// 存放数字 
    スタック< 文字 > OPTR。// 存放运算符
    、二重T1、T2、T3;
    一方、(CIN >> CH && CH =!' = ' 
    { 
        場合(F(CH))
        { 
            OPTR.push(CH)。
            CIN >>  CH。
        } 
        
        { 
            OPND.push(Z()); 
        } 
        ながら(!CH = ' = ' 
        { 
            IF (F(CH))
            { 
                IF (OPTR.empty())
                { 
                    OPTR.push(CH)。
                    CIN >> CH;
                     続行; 
                } 
                IF(CMP(CH、OPTR.top())== 1// 格納された後、小さな優先順位、
                { 
                    OPTR.push(CH); 
                    CIN >> CH;
                     続行; 
                } 
                そう IF(CMP(CH、OPTR.top())== 2// 大きな優先算出した後
                {
                     チャー C1を= CH; 
                    CIN >> CH; 
                    T2 = Z() ; 
                    T1 = OPND.top(); 
                    OPND.pop(); 
                    T3 = CAL(T1、T2、C1); 
                    OPND.push(T3); 
                } 
                
                { 
                    OPTR.pop()。
                    CIN  >>CH; 
                } 
            } 
            
            { 
                OPND.push(Z())。
            } 
        } 
        ながら(!OPTR.empty())
        { 
            CH = OPTR.top()。
            OPTR.pop(); 
            T2 = OPND.top()。
            OPND.pop(); 
            T1 = OPND.top()。
            OPND.pop(); 
            T3 = CAL(T1、T2、CH)。
            OPND.push(T3)。
        } 
        のprintf(" %.2lfする\ n "、OPND.top())。
        OPND.pop(); 
        getchar関数(); 
    } 
    戻り 0 
}

おそらく、そのデータの受信に注力

おすすめ

転載: www.cnblogs.com/tsj816523/p/11802111.html