棧運算器 Java實現

  • 順序是true and false, 運算符在中間

  • 狀態轉移圖要想清楚

  • 遇到運算符, 如果棧頂是數值就直接壓進去, 不要再去讀下一個來計算, 因爲我們的運算符在中間

  • 遇到數值, 這時再從棧中pop, 這時左中右是完整的, 可以進行計算

    • 棧頂是or(優先級低), 直接壓棧, 以後處理
    • 棧頂是and(優先級高), pop兩個, 計算完之後把新值壓棧
  • 最後and都處理完了, 棧裏只剩or和數值了, 再一個個pop就行

import java.util.*;
public class Main {
	//判斷是不是運算符
    static public boolean isOperator(String s){
        if(s.equals("and")||s.equals("or")){
            return true;
        }
        return false;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        LinkedList<String> data = new LinkedList<>();
        boolean isAnd = false;

        while(scan.hasNext()){
            String in = scan.next();

            //運算符在最左邊或者最右邊, 就錯誤
            if(Main.isOperator(in)&&(data.isEmpty()||(!scan.hasNext()))){
                System.out.println("error");
                return;
            }


            // 檢測到運算符
            if(Main.isOperator(in)){

                //由於已經知道data不爲空
                String out = data.peek();

                //連續兩個運算符
                if(Main.isOperator(out)){
                    System.out.println("error");
                    return;

                }else{
                    // 如果不是, 就直接把操作符壓進去
                    data.push(in);
                }

            }else{  //檢測到數值
                if(data.isEmpty()) data.push(in);  //如果data是空的話, 直接壓進去
                else{   //不空的話, 看看棧頂
                    String out = data.peek();
                    if(!Main.isOperator(out)){  //如果棧頂還是數值,報錯
                        System.out.println("error");
                        return;
                    }else if(out.equals("or")){  //如果棧頂是or, 直接壓進去
                        data.push(in);
                    }else{     //棧頂是and, 運算完再壓
                        data.pop();
                        boolean tmp1 = Boolean.parseBoolean(in);
                        boolean tmp2 = Boolean.parseBoolean(data.pop());
                        data.push(String.valueOf(tmp1&&tmp2));
                    }
                }
            }
        }


        //現在處理data

        boolean res = Boolean.parseBoolean(data.pop());

        while(!data.isEmpty()){
            data.pop();
            boolean new_b = Boolean.parseBoolean(data.pop());
            res = res||new_b;
        }


        System.out.println(res);


    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章