バックル力演習---基本的な電卓(224)

件名の説明:

https://leetcode-cn.com/problems/basic-calculator/

電卓は、単純な文字列式の基本的な値を計算するために実装しました。文字列式は、左括弧(右括弧)を含む、プラス+、マイナスも - 、スペース、負でない整数。

例1:入力: "1 + 1" 出力:2

例2:入力: "2-1 + 2" 出力:3

実施例3:入力: "(1 +(4 + 5 + 2)-3)+(+ 8 6)" 出力:23

注:1、あなたは、与えられた式が有効であると仮定することができます。2. Doが内蔵されたライブラリ関数はevalを使用しません。

トピック分析:

括弧内の式、及び内部部分式を計算優先度が外部よりも大きいの括弧の存在に起因1、スタックとデータ構造を考えます。

図2に示すように、加算および減算演算(A + B)+ Cは、A +(B + C)と同等であるが、(AB)+ Cはそう計算部分式を確実にするために、A-(B + C)と等価ではありません左から右への順。

図3に示すように、スタックデータ構造選択部分式は左から右に順次計算され、したがって、右から左に必要な順序をプッシュされ、入力を反転させる必要があります。

図4に示すように、被験者に限定されない例は、デジタル入力の各々は、必ずしもそう簡単番号1、123ともすることができるようなものではありません

問題解決のアイデア:

図1に示すように、入力逆トラバーサル、番号、演算子、右括弧はスタックにプッシュされます。

2、桁数は、必ずしも一つだけ、番号があるかもしれないが、そう処理の多くのようなこのようなもののために得られた逆トラバーサル数字列による走査数、数十、数百...、 ;

図3に示すように、走査で検出左括弧、スタックを積層するために必要と右括弧までスタック要素までオペレータに従って計算要素、および、結果はスタック、次いで横断続けます。

図4は、1/2/3の完了後、スタックが空でなく、スタックを計算し続ける場合、

Javaコード:

パブリック クラスLeetCode224_calculate { 

    プライベート 静的 最終 チャー LEFT =「(」; 

    プライベート 静的 最終 チャー RIGTH =「」) 

    プライベート 静的 最終 char型の ADD = '+' ; 

    プライベート 静的 最終 char型の SUB = ' - ' ; 

    プライベート 静的 最終 char型の SPACE = '' ; 

    プライベート 静的 最終 int型の NUM_10 = 10 ; 

    公共 int型の計算(文字列S){ 
        スタック<オブジェクト> =スタック新しい新しいスタック<>(); // 演算子と数字の両方を格納するために、オブジェクトの種類を選択
        INT番号= 0 ;
         int型 digitCount = 0 ;
         // 逆方向移動
        のためにint型のインデックス= s.length() - 。1;指数> = 0;インデックス){
             チャー CH = s.charAt(インデックス);
             IF(CH == 空間){
                 続行; 
            } 

            IF (Character.isDigit(CHによって)){
                 // 数字の加工シーン 
                番号+ = Math.pow(NUM_10、digitCount)*(CH - '0' )。
                digitCount ++ ; 
            } そうでなければ{
                 IF(digitCount> 0 ){ 
                    stack.push(数値);  = 0 ; 
                    digitCount = 0 ; 
                } 

                IF(CH == LEFT){
                     // 値算出部分式
                    INT subResult = calcSub(スタック); 
                    stack.pop(); // 右ブラケットポップ
                    stack.push(subResultを); 
                } { 
                    stack.push(CH)。
                } 
            } 
        } 

        // このステップは、単純なデジタル処理が重要である最後のシーン
        IF(digitCount> 0 ){ 
            stack.push(数値); 
        } 

        戻りcalcSub(スタック); 
    } 

    プライベート INT calcSub(スタック<OBJECT> スタック){
         int型 0 =結果IF(!stack.isEmpty()){
             // スタック処理の開始時に空ではないことは、スタックはデジタルでなければならない 
            結果=(INT )stack.pop(); 
        } 

        ながら(stack.isEmpty()! &&!((CHAR)stack.peek()== RIGTH)){
             charは =(動作CHAR )()をstack.pop。
            場合(==動作ADD)を{ 
                結果 + =(INT )stack.pop(); 
            } 他の 場合(==動作{SUB)
                結果 - =(INT )stack.pop(); 
            } 
        } 
        戻り値の結果; 
    } 
}

バックル力の営業成績:

 

おすすめ

転載: www.cnblogs.com/sniffs/p/12451821.html