中缀表达式转化为逆波兰表达式(用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);
    }
}
  • 相关结果:

在这里插入图片描述

以下是一种 Java 实现: ```java import java.util.*; public class ReversePolishNotation { public static void main(String[] args) { String expression = "3+4*2/(1-5)^2"; List<String> postfix = infixToPostfix(expression); System.out.println("Infix: " + expression); System.out.println("Postfix: " + postfix); System.out.println("Result: " + evaluatePostfix(postfix)); } public static List<String> infixToPostfix(String expression) { List<String> postfix = new ArrayList<>(); Stack<Character> stack = new Stack<>(); int i = 0; while (i < expression.length()) { char c = expression.charAt(i); if (Character.isDigit(c)) { StringBuilder sb = new StringBuilder(); while (i < expression.length() && Character.isDigit(expression.charAt(i))) { sb.append(expression.charAt(i)); i++; } postfix.add(sb.toString()); } else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^') { while (!stack.isEmpty() && precedence(stack.peek()) >= precedence(c)) { postfix.add(stack.pop().toString()); } stack.push(c); i++; } else if (c == '(') { stack.push(c); i++; } else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { postfix.add(stack.pop().toString()); } if (!stack.isEmpty() && stack.peek() == '(') { stack.pop(); } i++; } else { i++; } } while (!stack.isEmpty()) { postfix.add(stack.pop().toString()); } return postfix; } public static int evaluatePostfix(List<String> postfix) { Stack<Integer> stack = new Stack<>(); for (String s : postfix) { if (Character.isDigit(s.charAt(0))) { stack.push(Integer.parseInt(s)); } else { int b = stack.pop(); int a = stack.pop(); int result = 0; switch (s.charAt(0)) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': result = a / b; break; case '^': result = (int) Math.pow(a, b); break; } stack.push(result); } } return stack.pop(); } private static int precedence(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } else if (op == '^') { return 3; } else { return 0; } } } ``` 在这个实现中,我们首先定义了两个方法: 1. `infixToPostfix`:将中缀表达式转换为后缀表达式。 2. `evaluatePostfix`:计算后缀表达式的值。 `infixToPostfix` 方法使用一个来解析输入表达式。我们逐个处理输入表达式的字符,如果遇到数字,我们将其添加到后缀表达式列表中。如果遇到运算符,我们将其与顶的运算符比较,如果顶运算符的优先级大于等于当前运算符,我们就将顶运算符弹出并添加到后缀表达式列表中。然后将当前运算符压入中。如果遇到左括号,我们将其压入中。如果遇到右括号,我们将顶元素弹出并添加到后缀表达式列表中,直到遇到左括号。最后,我们将中剩余的元素弹出并添加到后缀表达式列表中。 `evaluatePostfix` 方法使用一个来计算后缀表达式。我们逐个处理后缀表达式中的元素,如果遇到数字,我们将其压入中。如果遇到运算符,我们就从中弹出两个元素,进行相应的运算,并将结果压入中。最后,中剩下的元素就是表达式的值。 这个实现的时间复杂度是 O(n),其中 n 是表达式的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值