算法题解-基本计算器2

简介: 算法题解-基本计算器2

题目


给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值,整数除法仅保留整数部分。

输入: s = " 3+5 / 2 "
输出: 5


题解


第一种


我们在函数中先声明一个calculate函数,这个函数接受一个参数s,表示我们需要进行计算的算术表达式,接下来我们定义了一个辅助函数isNum,用于判断一个字符是否为数字,然后使用正则表达式去除了表达式中的空格,接着定义了一个栈stack和一个变量preSign以及一个变量num,stack用于存储运算符和数字,preSign用于记录上一个运算符,num用于记录当前数字的值,然后我们使用split方法将表达式s转换成字符数组,然后我们遍历该字符数组中的每一个字符,如果该字符是数字,我们就将其转换为数值类型并存储到变量num中,如果该字符不是数字或者已经遍历到了表达式的最后一个字符,我们就根据preSign的值将num压入栈stack中,并更新preSign和num的值,在遍历完整个表达式后,使用reduce方法计算栈stack中所有元素的和后我们将其返回出去即可

var calculate = function(s) {
    const isNum = (chr) => !isNaN(Number(chr))
    s = s.replace(/\s/g, '');
    const stack = new Array();
    let preSign = '+';
    let num = 0;
    const n = s.length;
    s.split('').map((chr, i)=>{
        if (isNum(chr)) {        
            num = num * 10 + Number(chr)
        }
        if (!isNum(chr) || 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 | 0);
            }   
            preSign = chr;
            num = 0;
        }
    });        
    return stack.reduce((pre, cur)=>pre+cur, 0);
};


第二种


我们在函数中先s参数中的空格去除,我们这里使用正则表达式来实现,主要为了去除表达式中可能存在的空格,方便我们后续的计算,然后我们使用循环去判断表达式中是否还包含除法/或乘法*的运算符,如果包含我们则继续进行计算,在每次循环中,我们使用正则表达式去匹配表达式中的乘法或除法运算,并执行对应的操作,如果我们匹配到乘法或除法运算的表达式我们则将其替换为回调函数中的返回值,回调函数的参数p1、p2、p3分别表示匹配到的第一个数字、运算符、第二个数字,我们在回调函数中,通过判断运算符p2的值,如果是乘法我们则返回两个数字的乘积;如果是除法我们则使用Math.floor函数将两个数字的整除结果向下取整后返回,我们通过不断的匹配和替换,直到表达式中不再包含乘法和除法运算符,最后我们使用eval函数来计算最终的表达式结果返回即可

function calculate1(s) {
  s = s.replace(/\s/g, '')
  while (s.includes('/') || s.includes('*')) {
    s = s.replace(/(\d+)(\/|\*)(\d+)/, (_, p1, p2, p3) => {
      return p2 === '*' ? p1 * p3 : Math.floor(p1 / p3)
    })
  }
  return eval(s)
}
相关文章
|
6月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 224. 基本计算器 算法解析
☆打卡算法☆LeetCode 224. 基本计算器 算法解析
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
46 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
3月前
|
算法 C++
第一周算法设计与分析 F : 模拟计算器
该文章 "第一周算法设计与分析 F : 模拟计算器" 的摘要或讨论。这篇文章介绍了如何设计一个程序来模拟一个基本的计算器,处理包含加、减、乘运算的表达式,并给出了相应的C++代码实现
|
6月前
|
存储 算法
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
68 1
|
算法 前端开发 存储
前端算法-计算器
前端算法-计算器
|
算法 Java
JAVA计算器算法实现
JAVA计算器算法实现
156 1
|
算法
算法 | 计算器系列 | 刷题打卡
算法 | 计算器系列 | 刷题打卡
132 0
算法 | 计算器系列 | 刷题打卡
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。