力扣题目练习

计算表达式的值:

package com.example.rabitmq.sy;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class Calculator {
    static Map<Character, Integer> map = new HashMap() {{
        put('+', 1);
        put('-', 1);
        put('*', 2);
        put('/', 2);
    }};

    public static void main(String[] args) {
        String expression = "17*2*2-5+1-5+3-4";
        int x = ds(expression);
        System.out.println(x);
    }

    private static int ds(String expression) {
        int length = expression.length();
        char c = ' ';
        int index = 0;
        String keepString = "";
        int res = 0;
        Stack<Integer> nums = new Stack<>();
        Stack<Character> ops = new Stack<>();
        while (true) {
            c = expression.substring(index, index + 1).charAt(0);
            if (isOrder(c)) {
                if (!ops.isEmpty()) {
                        if (order(c) > order(ops.peek())) {
                            ops.push(c);
                        } else {
                            Integer num1 = nums.pop();
                            Integer num2 = nums.pop();
                            Character pop = ops.pop();
                            res = cal(num1, num2, pop);
                            nums.push(res);
                            ops.push(c);
                        }


                }else{
                    ops.push(c);
                }
            } else {
                keepString += c;
                if (expression.length() - 1 == index) {
                    nums.push(Integer.parseInt(keepString));
                } else {
                    if (isOrder(expression.substring(index + 1, index + 2).charAt(0))) {
                        nums.push(Integer.parseInt(keepString));
                        keepString = "";
                    }
                }
            }
            index++;
            if (index >= expression.length()) {
                break;
            }

        }
        while (!ops.isEmpty()) {
            Integer num1 = nums.pop();
            Integer num2 = nums.pop();
            Character pop = ops.pop();
            res = cal(num1, num2, pop);
            nums.push(res);
        }
        return nums.pop();
    }

    private static int cal(Integer num1, Integer num2, Character ops) {
        switch (ops) {
            case '+':
                return num1 + num2;
            case '-':
                return num2 - num1;
            case '*':
                return num1 * num2;
            case '/':
                return num2 / num1;
            default:
        }
        return 0;
    }

    private static int order(char c) {
        return map.get(c);
    }

    private static boolean isOrder(char c) {
        String s = String.valueOf(c);
        return "*".equals(s) || "/".equals(s) || "+".equals(s) || "-".equals(s);
    }

}

后缀表达式:

package com.example.rabitmq.sy.s;

import java.util.*;

public class PolandNotation {
    public static void main(String[] args) {
        String expression = "1+((22+3)*4)-5";
        List<String> zh = zh(expression);
        System.out.println("中缀表达式::"+zh);
        List<String> hz = hz(zh);
        System.out.println(hz+"后缀");
        int result=ca(hz);
        System.out.println(result);
    }

    private static int ca(List<String> hz) {
        Stack<Integer> stack=new Stack<>();
        for (String s : hz) {
            if(isOps(s)){
                stack.push(Integer.parseInt(s));
            }else{
                Integer num1=stack.pop();
                Integer num2=stack.pop();
                switch (s) {
                    case "+":
                        stack.push(num1+num2);
                        break;
                    case "-":
                        stack.push(num2-num1);
                        break;
                    case "/":
                        stack.push(num2/num1);
                        break;
                    case "*":
                        stack.push(num1*num2);
                        break;
                    default:
                        break;
                }
            }
        }
        return stack.pop();
    }

    private static boolean isOps(String s1) {
        return !("+".equals(s1) || "-".equals(s1) || "/".equals(s1) || "*".equals(s1));
    }

    //定义优先级
    static Map<String, Integer> map = new HashMap() {{
        put("+", 1);
        put("-", 1);
        put("*", 2);
        put("/", 2);
        put("(", 0);
        put(")", 0);
    }};
    private static List<String> hz(List<String> infixExpressionList) {
        Stack<String> stack=new Stack<>();
        List<String> res=new ArrayList<>();
        for (String s : infixExpressionList) {
            if (s.matches("\\d+")){
                res.add(s);
            }else if (s.equals("(")){
                stack.push(s);
            }else if (s.equals(")")){
                while (!stack.peek().equals("(")){
                    res.add(stack.pop());
                }
                stack.pop(); //吐掉(
            }else{
                //比较符号的优先级 小吐了往res里面加
                while (stack.size()!=0 && order(s)<=order(stack.peek())){
                    res.add(stack.pop());
                }
                stack.push(s);
            }
        }
        while (!stack.isEmpty()){
            res.add(stack.pop());
        }
        return res;
    }

    private static int order(String s) {
        return map.get(s);
    }

    private static List<String> zh(String expression) {
        int i=0;
        char c=' ';
        String str="";
        List<String> ls=new ArrayList<>();
        while (i<expression.length()){
            if ((c=expression.charAt(i))<47 || (c=expression.charAt(i))>57) {
                ls.add(c+"");
                i++;
            }else{
                str=""; //置空的操作
                while (i<expression.length() && ((c=expression.charAt(i))>=48 && (c=expression.charAt(i))<=57)){
                    str+=c;
                    i++;
                }
                ls.add(str);
            }
        }
        return ls;
    }
}

力扣LeetCode)是一个全球性的编程练习平台,它提供了大量的编程题目,涵盖了从基础到高级不同难度的算法和数据结构题目,适用于刷题者在准备技术面试时进行系统训练。对于Python编程语言的学习者而言,力扣提供了一个良好的环境来练习Python编程,并通过解决实际问题来提升解决问题的能力。 使用Python在力扣刷题的指南可以包括以下几个步骤: 1. 注册和登录:首先访问力扣官网并注册一个账户,然后登录账户。 2. 选择题库:根据个人的需要和目标选择适合的题库进行练习力扣提供了不同难度级别的题目,以及按专题分类的题目。 3. 学习Python基础知识:在开始刷题之前,确保你对Python语言的基础知识有扎实的掌握,比如数据类型、控制结构、函数、类和对象等。 4. 阅读题目要求:详细阅读题目描述,理解题目要解决的问题是什么,并注意题目中给定的任何约束条件。 5. 编写解决方案:根据题目要求,尝试用Python编写解决方案。开始时可以先不考虑效率,确保能够实现功能。 6. 测试和调试:在力扣的代码编辑器中编写代码,并使用提供的测试用例来检查代码的正确性。调试代码,直到通过所有测试用例。 7. 优化代码:在确保代码正确的前提下,尝试优化代码的性能和可读性。 8. 学习解题思路:参考其他用户的解题思路和讨论,了解不同的解决方案和算法。 9. 定期复习:定期回到之前的题目,回顾和解决之前未能解决的题目,或者寻找更优的解决方案。 10. 参与讨论:在遇到困难时,可以参与力扣上的讨论区,与他人交流解题思路和算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值