后缀表达式计算算术表达式

最近在学习二叉树,学习了怎样计算算术表达式

计算算术表达式的大体思路是:
1. 首先是将中缀表达式转换成后缀表达式
2. 将后缀表达式,借助栈就能轻易的求出值
例如:
(1+2)x3的后缀表达式是 12+3x,借助一个栈,将1,2放进去,在发现是+,将1,2弹出,计算1+2,计算出结果(3),放进去,栈中有3,3再遇见‘x’号,将3,3弹出,计算出结果(9),最终计算出结果。

    //确定运算符的优先级
    HashMap<Character,Integer> map=new HashMap<Character,Integer>();
    public void initiall(){
        map.put('#', -1);
        map.put('+', 0);
        map.put('-', 1);
        map.put('*', 2);
        map.put('/', 3);
    }
    //设置一个Linkedlist存放后缀表达式
    //设置一个Stack存放运算符
    private LinkedList<String> linkedlist=new LinkedList<String>();
    private Stack<Character> stack=new Stack<Character>();

接下来将算术表达式转换成后缀表达式

    public void opeator() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] char_str=br.readLine().toCharArray();
        stack.push('#');
        int i=0;
        while(i<char_str.length){
            if(char_str[i]=='('){
                stack.push(char_str[i]);
            }
            else if(char_str[i]==')'){
                Character temp=stack.pop();
                while(temp!='('){
                    linkedlist.add(temp.toString());
                    temp=stack.pop();
                }
            }
            else if(map.containsKey(char_str[i])){
                Character temp=stack.peek();
                while(temp!='('&&map.get(temp)>map.get(char_str[i])){
                    temp=stack.pop();
                    linkedlist.add(temp.toString());
                    temp=stack.peek();
                }
                stack.push(char_str[i]);
            }
            else{
                linkedlist.add(String.valueOf(char_str[i]));
            }
            i++;
        }
    }

转换成后缀表达式后,再根据栈求出结果

    public int getResult(){
        Iterator<String> iterator=linkedlist.iterator();
        Stack<Integer> stackInt=new Stack<Integer>();
        while(iterator.hasNext()){
            String str=iterator.next();
            if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
                int a=stackInt.pop();
                int b=stackInt.pop();
                int result=0;
                if(str.equals("+")){
                    result=a+b;
                }
                else if(str.equals("-")){
                    result=b-a;
                }
                else if(str.equals("*")){
                    result=a*b;
                }
                else if(str.equals("/")){
                    result=a/b;
                }
                stackInt.push(result);
            }
            else{
                stackInt.push(Integer.parseInt(str));
            }
        }
        return stackInt.pop();
    }

可能没有考虑出错的情况,有点不好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值