栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

文章目录
    • 中缀表达式转后缀表达式思路
    • 逆波兰表达式计算思路
    • 代码实现


中缀表达式转后缀表达式思路

1、初始化两个栈:运算符栈s1和储存中间结果的栈s2

2、从左至右扫描中缀表达式

3、遇到操作数时,将其压入s2

4、遇到运算符时,比较其与s1栈顶运算符的优先级
①如果s1为空,或栈顶运算符为左括号“(”, 则直接将此运算符入栈s1
②否则,若优先级比栈顶运算符的高,也将运算符压入s1
③否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)

5、遇到括号时
①如果是左括号“(”,则直接压入s1
②如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为
止,此时将这一对括号丢弃

6、重复步骤2至5,直到表达式结束

7、将s1中剩余的运算符依次弹出并压入s2

8、依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式


逆波兰表达式计算思路

(3+4)*5-6 对应的后缀表达式为 3 4 + 5 * 6 -,针对后缀表达式求值步骤如下:

1、从左至右扫描,将3和4压入堆栈

2、遇到+运算符,弹出4和3 (4 为栈顶元素,3为次顶元素),计算出3+4的值,得 7,再将7入栈

3、将5入栈

4、接下来是运算符,弹出5和7,计算出75=35,将35入栈

5、将6入栈

6、最后是 - 运算符,弹出35和6,计算35-6=29, 由此得出最终结果


代码实现
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;


public class PolandNotation {
    public static void main(String[] args) {
        //给一个中缀表达式
        String expression = "1+((2+3)*4)-10";
        //将中缀表达式放入List
        List infixList = toInfixexpression(expression);
        //将中缀表达式对应的List转换为逆波兰表达式对应的List
        List suffixList = parseSuffixexpression(infixList);
        //用逆波兰表达式(后缀表达式)进行计算
        int result = calculate(suffixList);
        System.out.println(result);
    }

    //将中缀表达式放入List中
    public static List toInfixexpression(String expression){
        List ls = new ArrayList<>();
        int i = 0; //相当于一个指针,用来遍历表达式
        String str; //用来拼接多位数
        char ch; //每遍历一个,就存入ch
        do {
            //如果不是数,直接加入
            if ((ch = expression.charAt(i)) < 48 || (ch = expression.charAt(i)) > 57){
                ls.add(ch + "");
                i++;
            }else {
                str = "";
                while (i < expression.length() && (ch = expression.charAt(i)) >= 48 && (ch = expression.charAt(i)) <= 57){
                    str += ch;
                    i++;
                }
                ls.add(str);
            }
        }while (i < expression.length());
        return ls;
    }

    //将中缀表达式对应的List转成逆波兰表达式对应的List
    public static List parseSuffixexpression(List infixList){
        Stack s1 = new Stack(); //符号栈
        //由于操作中没有进行过pop,可以使用List替换中间结果栈Stack
        List s2 = new ArrayList();
        for (String item : infixList){
            if (item.matches("\d+")){
                s2.add(item);
            }else if (item.equals("(")){
                s1.push(item);
            }else if (item.equals(")")){
                while (!s1.peek().equals("(")){
                    s2.add(s1.pop());
                }
                s1.pop(); //将 ( pop出去
            }else {
                while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)){
                    s2.add(s1.pop());
                }
                s1.push(item);
            }
        }
        while (s1.size() != 0){
            s2.add(s1.pop());
        }
        return s2;
    }

    //逆波兰表达式计算
    public static int calculate(List expressionList){
        //创建一个栈
        Stack strings = new Stack();
        //遍历列表
        for (String item : expressionList){
            if (item.matches("\d+")){ //匹配多位数
                strings.push(item);
            }else {
                int num2 = Integer.parseInt(strings.pop());
                int num1 = Integer.parseInt(strings.pop());
                String ch = item;
                int res = 0;
                switch (ch){
                    case "+":
                        res = num1 + num2;
                        break;
                    case "-":
                        res = num1 - num2;
                        break;
                    case "*":
                        res = num1 * num2;
                        break;
                    case "/":
                        res = num1 / num2;
                        break;
                    default:
                        throw new RuntimeException("运算符不正确!");
                }
                strings.push(res + "");
            }
        }
        //for循环结束留在栈里的即为计算结果
        return Integer.parseInt(strings.pop());
    }
}

//该类返回运算符优先级
class Operation{
    private static int ADD = 1;
    private static int SUB = 1;
    private static int MUL = 2;
    private static int DIV = 2;

    public static int getValue(String operation){
        int res = 0;
        switch (operation){
            case "+":
                res = ADD;
                break;
            case "-":
                res = SUB;
                break;
            case "*":
                res = MUL;
                break;
            case "/":
                res = DIV;
                break;
            default:
                System.out.println("运算符不正确!");
                break;
        }
        return res;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/358491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号