首页 > 试题广场 >

表达式求值

[编程题]表达式求值
  • 热度指数:90642 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:,保证计算结果始终在整型范围内

要求:空间复杂度: ,时间复杂度
示例1

输入

"1+2"

输出

3
示例2

输入

"(2*(3-4))*5"

输出

-10
示例3

输入

"3+2*3*4-1"

输出

26

非常好懂的,有注释喔

 function solve(s) {
  // write code here
  let ops = []; // 用来存储运算符
  let nums = []; // 用来存储数值和每次计算的结果
//   console.log(isNaN(parseInt(s[0])));
  for (let i = 0; i < s.length; i++) {
     if('(*'.indexOf(s[i]) > -1) { // 判断 s[i] 是否为  ( 和 * 
         ops.push(s[i])  // 是就入栈
     } else if(!isNaN(s[i])) { // 判断是否为 一个数字 ->number
         let temp = '' // 临时变量
         while(i<s.length && !isNaN(s[i])) {
             temp = temp + s[i++] // 因为 s 给的是一个字符串 所以通过这个办法 可以把 两位数的数字拼在一起
         }
         i-- // 如果 s[0] 和 s[1] 是一个操作数值12 经过上面的操作拼完了之后 i 会等于2 所以这里等让 i - 1 变回1 指向s[1]
         nums.push(parseInt(temp)) // 随后入栈
     } else if(s[i] == '+' || s[i] == '-') { // 如果是加号 或者 减号
         while(ops.length > 0 && '*+-'.indexOf(ops[ops.length - 1]) > -1) { // 就将 ops数组里
            //的  * + - 等运算符 pop 出去进行操作            
             let num1 = nums.pop()
             let num2 = nums.pop()
             let res = calc(ops.pop(), num1, num2)  // 加减乘 操作函数 在下面
             nums.push(res) // 将得出的结果入栈  ,  如果你有疑问, 为什么最后栈中的就一顶只有结果,没有别的操作数字, 因为
             // 上面 num1 和 num2 赋值的时候 都 pop出去了
         }
         ops.push(s[i]) // 最后将 此次遇到的 + 号丢进栈里
     } else if(s[i] == ')') { // 如果遇到 )
         while(ops.length > 0 && ops[ops.length - 1] != '(') { // 只要栈不空, 和不遇到 (
             // 就一直循环
             let num1 = nums.pop()
             let num2 = nums.pop()
             let res = calc(ops.pop(), num1, num2) // 思想和上面一样
             nums.push(res) // 结果入栈
         }
         ops.pop() // 把左括号丢出去
     }
  }
    while(ops.length > 0) {  // 最后 ops 不空 不停
        let num1=  nums.pop()
        let num2 = nums.pop()
        let temp_res = calc(ops.pop(), num1, num2)
        nums.push(temp_res) // 最后的结果 丢进去
    }
    return nums.pop() // 最后的结果 return 出去
}

function calc(op ,b ,a) {
    if(op == '+') return a + b
    if(op == '-') return a - b
    if(op == '*') return a * b
    return 0
}

module.exports = {
  solve: solve,
};
发表于 2022-08-02 20:41:05 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
function solve(s) {
  // write code here
  let index = 0;
  let index2 = 0;
  while (s.includes("(")) {
    index = s.indexOf(")");
    index2 = s.slice(0, index).lastIndexOf("(");
    s = s.slice(0, index2) + calc(s.slice(index2 + 1, index)) + s.slice(index + 1);
  }
  
  return Number(calc(s));
  
  function calc(string) {
    const progress = [];
    let temp = 0;
    let index = 1;
    while (!Number(string)) {
      while (!"+-*".includes(string.charAt(index))) {
        index++;
      }
      progress.push(string.slice(0, index));
      progress.push(string.charAt(index));
      string = string.slice(index + 1);
      index = 1;
    }
    progress.push(string);
    while (progress.length > 1) {
      if (progress.includes("*")) {
        index = progress.indexOf("*") - 1;
        temp = progress[index] * progress[index + 2];
        progress.splice(index, 3, temp);
        continue;
      }
      if (progress.includes("+")) {
        index = progress.indexOf("+") - 1;
        temp = Number(progress[index]) + Number(progress[index + 2]);
        progress.splice(index, 3, temp);
        continue;
      }
      if (progress.includes("-")) {
        index = progress.indexOf("-") - 1;
        temp = progress[index] - progress[index + 2];
        progress.splice(index, 3, temp);
        continue;
      }
    }
    return progress[0];
  }
}
module.exports = {
  solve: solve,
};

发表于 2022-07-13 10:42:50 回复(0)
js模式就是送人头各位,笑死,快来学js吧
function solve( s ) {
    // write code here
    return eval(s)
}
module.exports = {
    solve : solve
};


发表于 2022-04-07 22:08:10 回复(0)
function solve(s) {
    // write code here
    //   return  new Function(`return ${s}`)()
    //注意所有加减乘除都要算上前面的括号。
    const helper = function (str) {
        //先匹配()因为括号里面先算
        var kuohao = str.match(/\(([^)(]+)\)/);
        if (kuohao && kuohao[1]) {
            let ret = helper(kuohao[1]);
            return helper(str.replace(`(${kuohao[1]})`, ret));
        }

        var chenhao = str.match(/([-]?\d+)\*([-]?\d+)/);
        if (chenhao && chenhao[1] && chenhao[2]) {
            let ret = helper(chenhao[1]) * helper(chenhao[2]);
            return helper(str.replace(chenhao[0], ret));
        }

        var chuhao = str.match(/([-]?\d+)\/([-]?\d+)/);
        if (chuhao && chuhao[1] && chuhao[2]) {
            let ret = helper(chuhao[1]) * helper(chuhao[2]);
            return helper(str.replace(ret[0], ret));
        }
        var jia = str.match(/([-]?\d+)\+([-]?\d+)/);
        if (jia && jia[1] && jia[2]) {
            let ret = helper(jia[1]) + helper(jia[2]);
            return helper(str.replace(jia[0], ret));
        }
        var jian = str.match(/([-]?\d+)\-([-]?\d+)/);
        if (jian && jian[1] && jian[2]) {
            const ret = helper(jian[1]) - helper(jian[2]);
            return helper(str.replace(jian[0], ret));
        }
        return parseInt(str);
    }
    let result = helper(s)
    return result;
}


发表于 2021-12-02 19:44:44 回复(0)
天才的解法

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
function solve( s ) {
    return eval(s)
}
module.exports = {
    solve : solve
};


发表于 2021-11-27 14:12:58 回复(0)
23333333333
function solve( s ) {
    // write code here
    return ~~eval(s)
}

发表于 2021-11-15 14:57:56 回复(1)
function solve( s ) {
    return eval(s);
}
发表于 2021-08-23 11:48:42 回复(0)
js一行搞定
function solve( s ) {
    return eval(s);
}


发表于 2021-08-06 13:35:35 回复(2)
JavaScript使用eval可以直接计算出字符串结果😁
export function solve(s: string): number {
    // write code here
    return eval(s);
}

发表于 2021-06-24 15:34:17 回复(1)