スタックの実装RPN電卓(接尾辞)

輸入はjava.util.ArrayList;
輸入はjava.util.List;
輸入java.util.Stackを;

パブリック クラスPolandNotation {

    パブリック 静的 ボイドメイン(文字列[]引数){
         // 中置サフィックス転送機能
         // 1.1 +((2 + 3)* 4) - 5 => 1 2 + 3 + 4 * 5 -
         // リストSTR転送動作を容易にする2
         // 後置表現をに変換する変換リスト3 
        列=式」1 +((2 + 3)* 4)-5" 。;
        一覧 <文字列> infixExpressionList = toInfixExpressionList(式);
//         するSystem.out.println(infixExpressionList)。
        一覧<文字列> suffixExpressionList = parseSuffixExpressionList(infixExpressionList)。
        System.out.println(suffixExpressionList)。
        System.out.println(計算(suffixExpressionList))。
        // 逆ポーランド記法を定義
         // (30 + 4)= 5-6 *> 5 * 30 + 4 6 -
         @ 4 * 60 + 8 + 5-8 / 2 => 45 * + 8--6 2. 8 / +
         // 985から728×35÷26 => 985 26である* 35分の728である- 
        -文字列suffixExpression = "985 26 * 35分の728である" ;
         // のArrayListにまずsuffixExpression
         // 2 ArrayListのスタックで完了される計算方法に渡さ
 //         リストの<string> rpnList = getListString(suffixExpression);
 //         するSystem.out.println( "rpnList =" + rpnList);
 //         計算RES =(rpnList)をint型;
 //         System.out.println(RES); 
    }

    // 中置表現ターンpostfixの
    パブリック 静的の一覧<文字列> toInfixExpressionList(文字列S){
        一覧 <文字列> LS = 新しい新しいのArrayList <文字列> ();
         int型私= 0; // 文字列横断するため 
        の文字列STRを; // マルチビットスプライシング
        のchar C; // 文字がCに配置された横断を
        行います{
             IF((C = s.charAt(I))<48 ||(C = s.charAt(I))> 57です){
                ls.add( "" + C)。
                I ++ ;
            } {
                STR = ""; // 先将STR置成"" 
                ながら(I <s.length()&&(C = s.charAt(I))> = 48 &&(C = s.charAt(I))<= 57 ){
                    STR + = C。
                    I ++ ;
                }
                ls.add(STR)。
            }
        } 一方、(I < s.length())。
        リターンLS;
    }

    公共の 静的リストの<string> parseSuffixExpressionList(リストの<string> LS){
        スタックの<string> S1 = 新しい新しいスタックの<string>(); // シンボルスタック 
        リストの<string> S2 = 新しい新規のArrayList <ストリング>(); // 結果セット
        のための(文字列アイテム:LS){
             // もし数
            もし(item.matches( "\\ + D" )){
                s2.add(アイテム)
            } そう であれば(item.equals( "(" )){
                s1.push(アイテム)
            }  IF(item.equals(「)」)){
                 // 順次スタックポップオペレータS1、S2が左括弧は、括弧の対は破棄されている追加され遭遇するまで
                しばらく(!S1.peek()。等号を(「( ' )){
                    s2.add(s1.pop())。
                }
                )(s1.pop; // 括弧の除去 
            } {
                 // オペレータがオペレータにスタックオペレータの上面よりも小さい場合、スタックポップS1及びS2と、スタックの最上部が、オペレータより大きくなるまで比較を継続するために追加(PEEK( )ビューを取り出すことなく)
                、一方(s1.size()!= 0 && Operation.getValue(s1.peek())> = Operation.getValue(アイテム)){
                    s2.add(s1.pop())。
                }
                s1.push(項目); //は積載動作を継続します
            }
        }
        // S1が加え残りのオペレータが順次S2に吐出さ
        しばらく(s1.sizeを()!= 0 ){
            s2.add(s1.pop())。
        }
        返すS2を。
    }

    公共の 静的リストの<string> getListString(文字列suffixExpression){
        文字列[]スプリット = suffixExpression.split(」 " )。
        ArrayListの <文字列>リスト= 新しい ArrayListを<> ();
        {(分割文字列ELE)
            list.add(ELE)。
        }
        戻り値のリスト。
    }

    / **
     *左から右に1スキャンは数がスタックにあります
     * 2.オペレータは、2つのデジタル計算結果スタックのポップスタックに遭遇しました
     * 3.次の番号を押します
     二つの数字(番号3と2の結果)のスタックは、スタックポップを算出* 4オペレータ次遭遇
     *圧入次の数
     * 6次のポップ・スタックは、オペレータ二つの数字(番号4及び5の結果)最終的な結果に遭遇します
     *
     * @Param 文字のLSセット
     * @return 
     * / 
    パブリック 静的の int型の計算(一覧<文字列> LS){
        スタック <文字列>スタック= 新しいスタック<文字列> ();
        {(LS文字列の項目)
             であれば(item.matches( "\\ D +" )){
                stack.push(アイテム)
            } {
                 int型からnum2 = Integer.parseInt(stack.pop())。
                INT NUM1 = Integer.parseInt(stack.pop())。
                int型のres = 0 ;
                もし(item.equals( "+" )){
                    RES = + num1をnum2の。
                } そう であれば(item.equals( " - " )){
                    RES = NUM1 - num2の。
                } そう であれば(item.equals( "*" )){
                    RES = * NUM1のNUM2。
                } そう であれば(item.equals( "/" )){
                    RES = NUM1 / NUM2。
                } {
                     スロー 新しい新規のAのRuntimeException(「オペレータエラー」)。
                }
                stack.push( "" + RES)。
            }
        }
        リターンInteger.parseInt(stack.pop());
    }
}

// 対応オペレータ優先戻り
クラスオペレーション{
     プライベート 静的 INT ADD = 1。;
     プライベート 静的 INT SUB = 1 ;
     プライベート 静的 INT = 2 MUL ;
     プライベート 静的 INT = 2 DIV 

    パブリック 静的 INT のgetValue(文字列操作){
         int型の結果= 0 スイッチ(操作){
             場合、 "+" 
                結果 = ADD;
                休憩;
            ケース " - " 
                結果 = SUB;
                休憩;
            ケース "*" 
                結果 = MUL。
                休憩;
            ケース "/" 
                結果 = DIV。
                休憩;
            ケース "(" 休憩;
             デフォルト
                System.out.println( "演算子はサポートされていません" );
                 BREAK ;
        }
        戻り値の結果;
    }
}

おすすめ

転載: www.cnblogs.com/bingbug/p/12083782.html