中綴轉(zhuǎn)后綴表達式并計算值

  • 遇到操作數(shù):直接輸出(添加到后綴表達式中);
  • 棧為空時,遇到運算符,直接入棧;
  • 遇到左括號:將其入棧;
  • 遇到右括號:執(zhí)行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出;
  • 遇到其他運算符:加減乘除:彈出所有優(yōu)先級大于或者等于該運算符的棧頂元素,然后將該運算符入棧;
  • 最終將棧中的元素依次出棧,輸出;

計算9+(3-1)*2+8/2值

    public static void main(String[] args) {
        String s ="9+(3-1)*2+8/2";
        ArrayList<Character> list = createStack(s);
        Stack<Integer> stack = new Stack<Integer>();
        //計算
        list.forEach(character -> {
              if (Character.isDigit(character)) {stack.push(getNumber(character));return ;}
                Integer  num1 = stack.pop();
                Integer  num2 = stack.pop();
                switch (character){
                case '*': stack.push(num2*num1);break;
                case '+':;stack.push(num2+num1);break;
                case '-':;stack.push(num2-num1);break;
                case '/':;stack.push(num2/num1);break;
            }
        });
        //結(jié)果
        System.out.println();
        System.out.println(stack.pop());
    }
    static int getNumber(Character c){
        return Character.getNumericValue(c);
    }
    static ArrayList<Character> createStack(String s){
        Stack<Character> stack = new Stack();
        char[] chars = s.toCharArray();
        ArrayList list = new ArrayList();
        for(char c:chars){
            // 遇到操作數(shù):直接輸出(添加到后綴表達式中);
            if(Character.isLetterOrDigit(c)){
                list.add(c);
            }
        //遇到左括號:將其入棧;
            else if(c=='('){
                stack.push(c);
            }
          //遇到右括號:執(zhí)行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出;
            else if(c==')'){
                while (!(stack.peek()=='(')){
                    list.add(stack.pop());
                }
                stack.pop();
            }
       //遇到其他運算符:加減乘除:彈出所有優(yōu)先級大于或者等于該運算符的棧頂元素,然后將該運算符入棧;
            else{
                while (!stack.isEmpty()&&(getPriority(c)<=getPriority((char)stack.peek()))){
                    list.add(stack.pop());
                }
                stack.push(c);
            }
        }
      //最終將棧中的元素依次出棧,輸出;
        while (!stack.isEmpty()){
            list.add(stack.pop());
        }
       list.forEach(charc->{
           System.out.print(charc);
       });
        return list;
    }
    static int getPriority(char c){
        if(c=='*' || c=='/'){
            return 2;
        }
        else if(c=='+'||c=='-'){
            return 1;
        }
        else {
            return 0;
        }
    }
}```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 渲染: 1 當(dāng)前屏幕渲染:在GPU的當(dāng)前屏幕緩沖區(qū)中進行的渲染 2 離屏渲染:在GPU當(dāng)前屏幕緩沖區(qū)外另建緩沖區(qū)渲...
    adrian920閱讀 444評論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,190評論 1 10
  • 課程介紹 先修課:概率統(tǒng)計,程序設(shè)計實習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計,編譯原理,操作系統(tǒng),數(shù)據(jù)庫概論,人...
    ShellyWhen閱讀 2,463評論 0 3
  • 今天晚上沒有星星喔 因為很厚很厚的云把它遮住了 可是看不見不代表就不存在呀 可是如果看不見星星就是真的沒有星星喔 ...
    莉本莉閱讀 272評論 0 0
  • 路過的風(fēng)景 伴著雨聲 滴在心里都是濕答答的
    南西一閱讀 309評論 0 2

友情鏈接更多精彩內(nèi)容