首页 > 其他分享 >中缀表达式转后缀表达式

中缀表达式转后缀表达式

时间:2023-03-23 15:23:19浏览次数:32  
标签:中缀 后缀 List list item int res stack 表达式

  1.  

     

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

    public class text1 {
    public static void main(String[] args) {
    //先定义一个逆波兰表达式,为了方便,用空格分隔开
    String s = "3 4 + 5 * 6 -";
    //思路:先将3 4 + 5 * 6 -放到一个ArrayList的集合中去
    //将ArrayList传进一个方法,遍历ArrayList配合栈完成计算

    List<String> List = getList(s);
    System.out.println(List);
    int res = calculate(List);
    System.out.println("计算结果为" + res);
    //完成中缀表达式转后缀表达式
    //放到一个集合中去
    String s1 = "1+((2+3)*4)-5";
    List<String> ls = change(s1);
    System.out.println("中缀表达式为"+ls);
    List<String> parse = parse(ls);
    System.out.println("后缀表达式为"+parse);
    int ress=calculate(parse);
    System.out.println(ress);





    }

    //先定义一个逆波兰表达式,先将3 4 + 5 * 6 -放到一个ArrayList的集合中去
    public static List<String> getList(String s) {
    //将s分割
    String[] split = s.split(" ");
    List<String> list = new ArrayList<String>();
    for (String ele : split) {
    list.add(ele);
    }
    return list;
    }

    //计算
    public static int calculate(List<String> list) {
    //创建栈
    Stack<String> stack = new Stack<>();
    //遍历list
    for (String item : list) {
    if (item.matches("\\d+")) {
    stack.push(item);
    } else {
    //pop出两个数和一个符号进行运算
    int num1 = Integer.parseInt(stack.pop());
    int num2 = Integer.parseInt(stack.pop());
    int res = 0;
    if (item.equals("+")) {
    res = num1 + num2;
    } else if (item.equals("-")) {
    res = num2 - num1;
    } else if (item.equals("*")) {
    res = num1 * num2;
    } else if (item.equals("/")) {
    res = num2 / num1;
    } else {
    throw new RuntimeException("运算符有误");
    }
    stack.push("" + res);
    }

    }
    //返回栈的最后一个结果
    return Integer.parseInt(stack.pop());
    }

    //转化
    public static List<String> change(String s) {
    //创建一个空的集合去接收
    List<String> list = new ArrayList<String>();
    int i = 0;//指针
    String str;//对多位数的拼接
    char c;//遍历到每一个字符,就放入c
    //如果c是一个非数字,就转入到list
    //0【48】-9【57】对应的码为
    do {
    if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {
    list.add("" + c);
    i++;

    } else {
    //如果是数字,需要考虑多位数
    str = "";
    while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) {
    str += c;
    i++;
    }
    list.add(str);
    }
    } while (i < s.length());
    return list;
    }
    //中缀表达式转后缀表达式
    public static List<String> parse(List<String> sw){
    //符号栈
    Stack<String> stack = new Stack<>();
    //数栈用集合表示
    List<String> list = new ArrayList<String>();
    for (String item:sw){
    //如果是一个数
    if (item.matches("\\d+")){
    list.add(item);
    }else if (item.equals("(")){
    stack.push(item);
    }else if (item.equals(")")){
    //依次将stack中的符号弹到list中,直到遇到左括号
    while (!stack.peek().equals("(")){
    list.add(stack.pop());
    }
    stack.pop();//将"(“弹出栈,这个十分重要


    }else {
    //比较优先级问题
    while (stack.size()!=0&&opertion .value(stack.peek())>=opertion.value(item)){
    list.add(stack.pop());
    }
    //将运算符压入栈
    stack.push(item);
    }

    }
    //将剩余的运算符压入list
    while (stack.size()!=0){
    list.add(stack.pop());
    }
    //不需要逆向输出,应为用的是list
    return list;
    }
    }
    //编写一个类来比较运算符的优先级
    class opertion{

    private static int add=1;
    private static int sub=1;
    private static int div=2;
    private static int mlp=2;
    public static int value(String oper){
    int res=0;
    switch (oper){

    case "+":
    res= add;
    break;
    case "-":
    res= sub;
    break;
    case "*":
    res= mlp;
    break;
    case "/":
    res= div;
    break;
    default:
    System.out.println("运算符错误");
    break;
    }
    return res;
    }
    }

标签:中缀,后缀,List,list,item,int,res,stack,表达式
From: https://www.cnblogs.com/lyjzht/p/17247578.html

相关文章

  • 正则表达式matcher.group用法
    原来,group是针对()来说的,group(0)就是指的整个串,group(1)指的是第一个括号里的东西,group(2)指的第二个括号里的东西。 最近学习正则表达式,发现Java中的一些术语与其他地方描述的有......
  • 算法 | 中缀表达式转后缀表达式并计算结果(利用栈)
    1.手动实现中缀转后缀2.代码实现中缀转后缀并计算表达式结果为了简化问题,假设算术运算符仅由加、减、乘、除4种运算符和左、右括号组成。step1:声明栈结构#include......
  • js 截取文件后缀名的3种方式
    1.情景展示当我们使用文件上传插件,将文件上传到后台,有时候需要上传的不止一种文件类型,即:图片或着PDF;我们可能需要根据不同文件类型,提供不同的预览地址。如何根据文件......
  • 正则表达式注意事项
    问题正则表达式一段时间不常用就经常忘掉,这里记录一下容易忘掉的知识点。?=和?:和?!和?<=和?<!要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念://前瞻:e......
  • Python中使用正则表达式以及正则表达式匹配规则
    ​1导库importre2使用模板re_pattern=re.compile(pattern,flags=0)result=re.findall(re_pattern,string)3说明参数描述pattern匹配的正则......
  • 正则表达式
    [0,1]^[01]$[3,100]^[3-9]$|^(?:[1-9]\\d|100)$[1,1000]^([1-9][0-9]{0,2}|1000)$[1,10000]^([1-9][0-9]{0,3}|10000)$[0,99]^([0-9][0-9]{0,1})$[0,......
  • javaweb-Cookie、Kaptcha、正则表达式
    资料来源于:B站尚硅谷JavaWeb教程(全新技术栈,全程实战),本人才疏学浅,记录笔记以供日后回顾由于是多个视频内容混合在一起,因此只放了第一个链接视频链接知识点1.Cook......
  • python 之lambda表达式
    今天做题的时候发现了lambda表达式,就去网上搜了搜,这么说吧,lambda表达式算是python一种比较方便的语法了,主要作用是代替简单的函数,免去了编写函数的烦恼,语法也更加地简洁。......
  • 正则表达式
    pattern.split测试结果pattern.matcher测试结果......
  • 常用正则表达式
    from:cdoco/common-regex:常用正则表达式-收集一些在平时项目开发中经常用到的正则表达式。(github.com) 邮箱gaozihang-001@gmail.com 只允许英文字母、数字、下......