JAVAデータ構造-スタックと中綴り表現、サフィックス表現が簡単計算機を実現します.

4119 ワード

先進的な後出のデータ構造、倉庫入、倉庫出、 ポインタを常にスタックの一番上に向けて指定します.データがない場合は-1です.
 
1.配列シミュレーションを使ってスタック-構造を定義する
class ArrayStack {
    private int MaxSize;   //        
    private int[] array;    //         
    private int top = -1;    //    ,     -1     

    public ArrayStack(int maxSize) {        
        MaxSize = maxSize;
        array = new int[maxSize];
}}
2.スタックの方法
   1.データがある場合topは0から開始します.   だから top=maxSize-1の場合は満杯となります.               2.top=-1は空です
   3.スタックに入るときは、トップを上に移動し、トップの位置にデータを追加します.             4.出庫時 topを下に移動します.データは実際にスタックから出ていません.topはスタックトップデータの変化を指します.
   5.スタックを巡回する場合、 スタックトップから巡回
    public Boolean isFull() {                 -1  ,  top 0  
        return top == MaxSize - 1;
    }

    public Boolean isEmpty() {       top=-1 ,   
        return top == -1;
    }

        ,   
    public void push(int num) {
        if (isFull()) {
            System.out.println("   ,    ~~");
            return;
        }
        top++;
        array[top] = num;        }

    *       ,   
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("   ,    ~!");
        }
        int value = array[top];
        top--;
        return value;            }
二.中綴り表現とスタックの実現 単純計算機
  1.プレフィックス式   (3+4)×5-6対応するプレフィックス表現は、-× + 3 4 5 6
     .右から左にスキャンする表式  数字がスタックに入ると、符号が出ます. イジェクト 二つの数字   number 1  number 2       使用 number 1 演算子 number 2
   2.中式   サフィックス表現はよくある演算式です.例えば、(3+4)×5-6   人々はよく計算方法を使います.
   3.拡張式   (3+4)×5-6対応の接尾辞表現は3 4+5です.× 6–
      .左から右へ式をスキャンします.  数字がスタックに入ると、符号が出ます. イジェクト 二つの数字   number 1  number 2       使用 number 2 演算子 number 1
2.中式計算 大体の考え
  1.二つのスタックを用意する      1. データストア       2.符号スタックの保存        
  2.果が符号である場合:  1.符号スタックが空の場合 または 現在の記号の優先度が大きい スタックトップ記号の優先度  直接倉庫に入れる     
                          2.もし 現在の記号の優先度は以下です. スタックトップ記号の優先度  データスタックの2つの数字を取り出します. num 1, num 2  演算子を取り出します.
                          運をつける 算を置く num 2 演算子 num 1,  演算結果をデータスタックに入力し、新しい記号をスタックに入れます.
3.最後に スキャン完了、順番  二つのデータを取り出します 演算子 計算をして、結果をスタックに入れます.
 データスタックに残した数字は最後の計算結果です.
式のような列  expression="3+2*3-1"   
  1.初めてスキャンする  データースタック   3,2,3です         記号スタックは+、*        2.-をスキャンすると、  優先度が*より小さい    データスタックの二つの数字を取り出して計算します.    そして、スタックに入ります
  3.データスタック   3,6です ,1       記号スタックは+です  ,-                       
   5.順次  二つのデータを取り出します 演算子 計算をして、結果をスタックに入れます.         6.最終データスタックの数字は8です.
三.拡張式とスタックの実現 単純計算機
 1.拡張式は計算機の計算に適しています.  中缀の表式は更に人类の计算に适します.    サフィックス表現も   逆ポーランド式
  2.次の通りです      中式    (30+4)*5-6    サフィックスに変換  「30 4+5*6-」          各文字をセットに入れます.      [3,4,+,5,*,6,-]
public List getArrayList(String expression) {

        List expresList  = new ArrayList<>();

        String[] s = expression.split(" ");
        for (String s1 : s) {
            expresList.add(s1);
        }
        return expresList;   }
3.遍歴 [3,4,+,5,*,6,-]  計算します javaを使う 提供するスタック
   1.数字であれば直接倉庫に入れる       2.符号なら 倉庫から二つの数字を取り出す.  現在の記号との計算  そして結果をスタックに入れる   3.最終スタックに数字を残して結果とする
private int Calculator(List arrayList) {
        Stack stack = new Stack<>();
        for (String item : arrayList) {
            if (item.matches("\\d+")){
                stack.push(item);
            }else {
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                int res= 0;
                if (item.equals("+")){
                    res=num2+num1;
                }else if (item.equals("-")){
                    res=num2-num1;
                }else if (item.equals("*")){
                    res=num2*num1;
                }else if (item.equals("/")){
                    res=num2/num1;
                }else {
                    throw new RuntimeException("    !");
                }
                stack.push(res+"");
            }}
        return Integer.parseInt(stack.pop());   }     29