中缀转后缀表达式并计算值

  • 遇到操作数:直接输出(添加到后缀表达式中);
  • 栈为空时,遇到运算符,直接入栈;
  • 遇到左括号:将其入栈;
  • 遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
  • 遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈;
  • 最终将栈中的元素依次出栈,输出;

计算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;
            }
        });
        //结果
        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){
            // 遇到操作数:直接输出(添加到后缀表达式中);
            if(Character.isLetterOrDigit(c)){
                list.add(c);
            }
        //遇到左括号:将其入栈;
            else if(c=='('){
                stack.push(c);
            }
          //遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
            else if(c==')'){
                while (!(stack.peek()=='(')){
                    list.add(stack.pop());
                }
                stack.pop();
            }
       //遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈;
            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;
        }
    }
}```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 渲染: 1 当前屏幕渲染:在GPU的当前屏幕缓冲区中进行的渲染 2 离屏渲染:在GPU当前屏幕缓冲区外另建缓冲区渲...
    adrian920阅读 3,012评论 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,431评论 1 10
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 6,904评论 0 3
  • 今天晚上沒有星星喔 因為很厚很厚的云把它遮住了 可是看不見不代表就不存在呀 可是如果看不見星星就是真的沒有星星喔 ...
    莉本莉阅读 1,716评论 0 0
  • 路过的风景 伴着雨声 滴在心里都是湿答答的
    南西一阅读 1,937评论 0 2