后缀表达式计算java

准备一个数字栈,一个运算符栈。大致的思路就是遇到,数字直接入数字栈,运算符看优先级进行处理,将要入运算符栈的运算符与栈顶的运算符进行比较,栈顶运算符优先级比较高的话,则把栈顶的运算符弹并且把数字栈的两个数字进行弹出,进行运算,并且把结果再次放到数字栈中,最后剩下的就是最终结果。如果运算符优先级比运算符栈顶的小,则把运算符进栈,最后把运算符都出栈

import java.util.Stack;

public class CD {
  //  StringBuffer buff=new StringBuffer();
    Stack<StringBuffer> out=new Stack<>();
    Stack<Character> chars=new Stack<>();
    //表达式输入,结果展示
    public static void main(String args[]){
        String source="(2+9)/3-5";
        String end=new CD().start(source);
       System.out.println(end);
    }
    
    //接收表达式,进行大致的处理
    public String start(String cource){
        chars.push('#');
        for(int i=0;i<cource.length();) {
            if(isChar(cource.charAt(i))){//这是运算符
                doChar(cource.charAt(i));
                i++;
            }else{//这是数字
                StringBuffer temp=new StringBuffer();
                while(i<cource.length()&&!isChar(cource.charAt(i))){//拼接数字
                    temp.append(cource.charAt(i));
                    i++;
                }
                doNum(temp);
            }
        }
        outStack();//把运算符都出了
        return out.peek().toString();
    }
    //以下具体的处理
    public  boolean isChar(char i){//是不是运算符
        if(i>='0'&&i<='9'||i=='.'){
            return false;
        }
        return true;
    }
    public void doChar(char operation){//遇到运算符时的处理
        if(chars.peek()=='('){
            chars.push(operation);
            return;
        }
        if(operation==')'){//遇到了')'把所有直到'('为止出栈了
            while(!chars.isEmpty()&&chars.peek()!='('){
                doCalculation(chars.pop());
            }
            if(!chars.isEmpty()){
                chars.pop();
            }
            return;
        }
        if(operationLv(operation)>operationLv(chars.peek())){
            chars.push(operation);
        }else{
            doCalculation(chars.pop());
            chars.push(operation);
        }
    }
    public void doNum(StringBuffer num){//遇到数字时的处理
        out.push(num);
    }
    public void outStack(){//到表达式最后时将所有的运算符出栈
        while(!chars.isEmpty()&&chars.peek()!='#'){//每出一个运算符进行一次运算
            doCalculation(chars.pop());
        }
    }
    public void doCalculation(char chars){//将两个数值取出进行运算,并将结果再次放到栈中
        double b=Double.parseDouble(out.pop().toString());
        double a=Double.parseDouble(out.pop().toString());
        double c=0;
        switch (chars){
            case '+':
                c=a+b;
                out.push(new StringBuffer(Double.toString(c)));break;
            case '-':
                c=a-b;
                out.push(new StringBuffer(Double.toString(c)));break;
            case '*':
                c=a*b;
                out.push(new StringBuffer(Double.toString(c)));break;
            case '/':
                c=a/b;
                out.push(new StringBuffer(Double.toString(c)));break;
        }
    }
    public int operationLv(char operation){//给运算符设置优先级
        switch (operation){
            case '+':
            case'-':
                return 1;
            case'*':
            case'/':
                return 2;
            case'(':
            case')':
                return 3;
            default:
                return 0;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值