中缀表达式转化为逆波兰表达式(用Java来实现)

  • 简要:

比如中缀表达式1+(23)-5+6/2+(12/3)转化为逆波兰表达式的步骤
1 从左向右扫描中缀表达式。
2 首先扫描到1,将1放入到result中,
3 后扫描到+,将+放入到stack中,
4 后扫描到(,将(放入到stack中,
5 后扫描到2,将2放入到result中,
6 后扫描到*,如果扫描到的操作符的优先级大于stack栈顶元素的优先级,则把扫描到的操作符放到stack中,反之,则把栈顶元素放入到result中。。又已知 * 操作符的优先级大于+,则将*放入到stack中。
7后扫描到),把)放入栈中,并且把双括号中的操作符放入到result中。
8 后面的步骤与前面的类似。





  • 相关代码:

import java.util.Stack;
public class Test {

    public static void main(String[] args){
        String s = "1+(2*3)-5+6/2+(1*2/3)";
        changeInFixExpression(s.toCharArray());

    }
    //比较字符的优先级;
    public static int Prioity(char c){
        switch (c){
            case '+': return 1;
            case '-': return 1;
            case '*': return 2;
            case '/': return 2;

        }
        return 0;
    }

    //将中缀表达式转化为后缀表达式。
    public static void changeInFixExpression(char a[]){
        String result="";
        Stack<Character> s1 = new Stack();
        for(int i =0;i<a.length;i++){
            //取出当前的字符。
            char c = a[i];

            //如果c字符是数字,直接加入到结果中。
            if(Character.isDigit(c)){
                result = result+c;
                continue;
            }
            //如果栈为空,或者c是‘(’,或者c的优先级大于栈顶的优先级,则直接入集合(栈);
            if(s1.empty()||c=='('||Prioity(c)>Prioity(s1.peek())){
                    s1.push(c);
                    continue;
            }

            //如果c是')',循环出栈并且将栈顶元素一个个都加入结果result中去,直到遇见了‘(’,且栈是非空的。
            if(c==')'){
                while(s1.peek()!='('&&!s1.empty()){
                    result = result+s1.peek();
                        s1.pop();
                }
                    //此时的栈顶元素应该就是‘(’,则需要把他出栈。
                    s1.pop();
                    continue;
            }

                //如果字符c的优先级小于栈顶元素,则栈顶元素一个个出栈,并且跑到结果result中去,直到栈顶元素小于字符c。且栈是非空的。
                while(!s1.isEmpty()&&Prioity(c)<=Prioity(s1.peek())){
                    result = result +s1.peek();
                    s1.pop();
                }
                //最终将字符c入栈。
            s1.push(c);
        }

        //循环结束,如果此时的栈是非空的,则将栈中的元素加入到结果result中。
        while(!s1.isEmpty()){
            result = result + s1.peek();
            s1.pop();
        }

        //打印出结果result中所有的元素。
        System.out.println(result);
    }
}
  • 相关结果:

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值