中缀表达式转后缀表达式_求表达式的值

中缀转后缀需要遵守以下规则
1、操作数:直接输出
2、“(”:直接入栈
3、“)”:”将“(”以前的直接输出,并将“)”出栈(不输出)
4、运算符+-*/:将优先级不小于该运算符的操作符出栈,最后将该运算符入栈
5、最后将栈中的元素依次弹出
6、优先级*/大于+-大于()

class InToSuf
{
    public List<String> solve(String[] op)//求op代表的中缀表达式的后缀表达式
    {
        Stack<String> stack=new Stack<>();
        List<String> h=new ArrayList<>();
        String temp="";
        for(int i=0;i<op.length;i++)
        {
            if(!isOpfu(op[i]))
            {
                h.add(op[i]);
                continue;
            }
            if(op[i].equals("("))
            {
                stack.push(op[i]);
                continue;
            }
            if (op[i].equals(")")) 
            {
                temp=stack.pop();
                while(!temp.equals("("))
                {
                    h.add(temp);
                    temp=stack.pop();
                }continue;
            }
            while(!stack.isEmpty())
            {
                temp=stack.peek();
                if(judge(temp, op[i])==1)
                {
                    h.add(temp);
                    stack.pop();
                }
                else break;
            }
            stack.push(op[i]);
        }
        while(!stack.isEmpty())
            h.add(stack.pop());
        return h;
    }
    private int judge(String a,String b)//比较操作符a、b的大小,若a>=b则返回1,否则返回-1
    {
        if(a.equals("*") || a.equals("/"))
            return 1;
        if(a.equals("+") || a.equals("-"))
        {
            if(!b.equals("*") && !b.equals("/"))
                return 1;
        }
        return -1;
    }
    private boolean isOpfu(String a)//判断a是否是操作符
    {
        if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/")
                ||a.equals("(")||a.equals(")"))
            return true;
        return false;
    }
}

求后缀表达式的值
1、操作数:入栈
2、操作符:将栈顶的两个元素弹出,先弹出的在运算符右边,后弹出的在左边,计算结果,并将结果入栈
3、最后剩余的元素就为表达式的值

class Calculate
{   //后缀表达式用list存放
    double calculate(List<String> suffix)
    {
        Stack<String> stack=new Stack<>();
        String temp="";
        for(int i=0;i<suffix.size();i++)
        {
            temp=suffix.get(i);
            if(isOpfu(temp))
            {
                String r=stack.pop();
                String l=stack.pop();
                String f=count(l, r, temp)+"";
                stack.push(f);
            }
            else
                stack.push(temp);
        }
        return Double.valueOf(stack.pop());
    }
    private boolean isOpfu(String a)//判断a是否是操作符
    {
        if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/")
                ||a.equals("(")||a.equals(")"))
            return true;
        return false;
    }
    private double count(String l,String r,String op)//根据运算符计算两个数的结果
    {
        double x=Double.valueOf(l);
        double y=Double.valueOf(r);
        switch (op) {
            case "+":
                return x+y;
            case "-":
                return x-y;
            case "*":
                return x*y;
            default:
                return x/y;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值