当前位置: 面试刷题>> 基本计算器(经典算法150题)


题目描述

实现一个基本的计算器来执行字符串形式的数学表达式计算。表达式仅包含非负整数、加号 +、减号 -、乘号 *、除号 / 四种运算符和空格 。整数除法仅保留整数部分。

注意

  • 输入保证有效且只包含上述字符。
  • 输入字符串中的数字和运算符之间可能包含一个或多个空格。
  • 你不能使用内置的库函数如 eval() 或其他内置的数学运算函数直接计算结果。

示例

输入"3+2*2" 输出7

输入" 3/2 " 输出1

输入" 3+5 / 2 " 输出5

PHP 示例代码

<?php

function calculate($s) {
    $s = str_replace(' ', '', $s); // 去除空格
    $stack = [];
    $num = 0;
    $sign = '+';

    for ($i = 0; $i < strlen($s); $i++) {
        if (is_numeric($s[$i])) {
            $num = $num * 10 + intval($s[$i]);
        }

        if (!is_numeric($s[$i]) && $s[$i] != ' ' || $i == strlen($s) - 1) {
            if ($sign == '+') {
                $stack[] = $num;
            } elseif ($sign == '-') {
                $stack[] = -$num;
            } elseif ($sign == '*') {
                $stack[count($stack) - 1] *= $num;
            } elseif ($sign == '/') {
                $stack[count($stack) - 1] = intval($stack[count($stack) - 1] / $num);
            }

            $num = 0;
            $sign = $s[$i];
        }
    }

    $result = 0;
    foreach ($stack as $num) {
        $result += $num;
    }

    return $result;
}

// 测试
echo calculate("3+2*2") . "\n"; // 输出: 7
echo calculate(" 3/2 ") . "\n"; // 输出: 1
echo calculate(" 3+5 / 2 ") . "\n"; // 输出: 5
?>

Python 示例代码

def calculate(s):
    s = s.replace(' ', '')  # 去除空格
    stack = []
    num = 0
    sign = '+'

    for char in s:
        if char.isdigit():
            num = num * 10 + int(char)
        if char in '+-*/' or char == s[-1]:
            if sign == '+':
                stack.append(num)
            elif sign == '-':
                stack.append(-num)
            elif sign == '*':
                stack[-1] *= num
            elif sign == '/':
                stack[-1] = int(stack[-1] / num)
            num = 0
            sign = char

    return sum(stack)

# 测试
print(calculate("3+2*2"))  # 输出: 7
print(calculate(" 3/2 "))  # 输出: 1
print(calculate(" 3+5 / 2 "))  # 输出: 5

JavaScript 示例代码

function calculate(s) {
    s = s.replace(/\s+/g, ''); // 去除空格
    let stack = [];
    let num = 0;
    let sign = '+';

    for (let char of s) {
        if (!isNaN(Number(char))) {
            num = num * 10 + parseInt(char);
        }

        if (isNaN(Number(char)) || char === s[s.length - 1]) {
            if (sign === '+') {
                stack.push(num);
            } else if (sign === '-') {
                stack.push(-num);
            } else if (sign === '*') {
                stack[stack.length - 1] *= num;
            } else if (sign === '/') {
                stack[stack.length - 1] = Math.trunc(stack[stack.length - 1] / num);
            }

            num = 0;
            sign = char;
        }
    }

    return stack.reduce((acc, curr) => acc + curr, 0);
}

// 测试
console.log(calculate("3+2*2")); // 输出: 7
console.log(calculate(" 3/2 ")); // 输出: 1
console.log(calculate(" 3+5 / 2 ")); // 输出: 5

以上示例代码分别用 PHP、Python 和 JavaScript 实现了基本计算器的功能,能够处理包含空格的字符串表达式,并正确执行加、减、乘、除运算。

推荐面试题