计算表达式【学习算法】

简介: 计算表达式【学习算法】

前言

2023-9-24 23:02:07

以下内容源自《【学习算法】》

仅供学习交流使用


推荐

计算表达式

逆波兰表达式求值

150. 逆波兰表达式求值

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> stack=new Stack();
        for(String s:tokens){
            if(s.equals("+")){
                int b=Integer.parseInt(stack.pop());
                int a=Integer.parseInt(stack.pop());
                int c=a+b;
                stack.push(Integer.toString(c));
            }else if(s.equals("-")){
                int b=Integer.parseInt(stack.pop());
                int a=Integer.parseInt(stack.pop());
                int c=a-b;
                stack.push(Integer.toString(c));
            }else if(s.equals("*")){
                int b=Integer.parseInt(stack.pop());
                int a=Integer.parseInt(stack.pop());
                int c=a*b;
                stack.push(Integer.toString(c));
            }else if(s.equals("/")){
                int b=Integer.parseInt(stack.pop());
                int a=Integer.parseInt(stack.pop());
                int c=a/b;
                stack.push(Integer.toString(c));
            }else{
                stack.push(s);
            }
        }
        return Integer.parseInt(stack.pop());
    }
}

中缀表达式求值

面试题 16.26. 计算器

LeetCode

class Solution {
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<Integer>();
        char preSign = '+';
        int num = 0;
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            if (Character.isDigit(s.charAt(i))) {
                num = num * 10 + s.charAt(i) - '0';
            }
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
                switch (preSign) {
                case '+':
                    stack.push(num);
                    break;
                case '-':
                    stack.push(-num);
                    break;
                case '*':
                    stack.push(stack.pop() * num);
                    break;
                default:
                    stack.push(stack.pop() / num);
                }
                preSign = s.charAt(i);
                num = 0;
            }
        }
        int ans = 0;
        while (!stack.isEmpty()) {
            ans += stack.pop();
        }
        return ans;
    }
}

算法优先分析法

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
public class Solution {
    public static void main(String[] args) {
        String token="3/2";
        int res=calculate(token);
        System.out.println(res);
    }
    static HashSet<Character> opSet =new HashSet<>();
    static {
        opSet.add('#');
        opSet.add('+');
        opSet.add('-');
        opSet.add('*');
        opSet.add('/');
        opSet.add('(');
        opSet.add(')');
    }
    static HashMap<Character,HashMap<Character,Character>> relation=new HashMap<>();
    static {
        HashMap<Character,Character> map=new HashMap<>();
        map.put('+','>');
        map.put('-','>');
        map.put('*','<');
        map.put('/','<');
        map.put('(','<');
        map.put(')','>');
        map.put('#','>');
        relation.put('+',map);
        relation.put('-',map);
        map=new HashMap<>();
        map.put('+','>');
        map.put('-','>');
        map.put('*','>');
        map.put('/','>');
        map.put('(','<');
        map.put(')','>');
        map.put('#','>');
        relation.put('*',map);
        relation.put('/',map);
        map=new HashMap<>();
        map.put('+','<');
        map.put('-','<');
        map.put('*','<');
        map.put('/','<');
        map.put('(','<');
        map.put(')','=');
        relation.put('(',map);
        map=new HashMap<>();
        map.put('+','>');
        map.put('-','>');
        map.put('*','>');
        map.put('/','>');
        map.put(')','>');
        map.put('#','>');
        relation.put(')',map);
        map=new HashMap<>();
        map.put('+','<');
        map.put('-','<');
        map.put('*','<');
        map.put('/','<');
        map.put('(','<');
        map.put('#','=');
        relation.put('#',map);
    }
    public static int calculate(String s) {
        s = s.replaceAll("\\s+","");
        s += '#';
        Deque<Integer> numStack = new ArrayDeque<>();
        Deque<Character> opStack = new ArrayDeque<>();
        opStack.push('#');
        int i = 0;
        char ch = s.charAt(i);
        while (ch != '#' || opStack.peek() != '#') {
            if (!opSet.contains(ch)) {
                while (ch == ' ') {
                    ch = s.charAt(++i);
                }
                int data = 0;
                data = ch - '0';
                ch = s.charAt(++i);
                while (!opSet.contains(ch)) {
                    data = data * 10 + ch - '0';
                    ch = s.charAt(++i);
                }
                numStack.push(data);
            } else {
                switch (compare(opStack.peek(), ch)) {
                    case '<':
                        opStack.push(ch);
                        ch = s.charAt(++i);
                        break;
                    case '=':
                        char x = opStack.pop();
                        ch = s.charAt(++i);
                        break;
                    case '>':
                        char op = opStack.pop();
                        Integer data2 = numStack.pop();
                        Integer data1 = numStack.pop();
                        int val = cal(data1, op, data2);
                        numStack.push(val);
                        break;
                }
            }
        }
        int val = numStack.pop();
        return val;
    }
    private static int cal(Integer data1, char op, Integer data2) {
        switch (op){
            case '+': return data1+data2;
            case '-': return data1-data2;
            case '*': return data1*data2;
            case '/': return data1/data2;
            default: return 0;
        }
    }
    private static char compare(char op1, char op2) {
        return relation.get(op1).get(op2);
    }
}

最后

我们都有光明的未来

祝大家考研上岸

祝大家工作顺利

祝大家得偿所愿

祝大家如愿以偿

点赞收藏关注哦

相关文章
|
3月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
4月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
171 0
|
3月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
232 1
|
7月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
9月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
9月前
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
230 14
|
11月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
2369 11
架构学习:7种负载均衡算法策略
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
259 0

热门文章

最新文章