当前位置: 面试刷题>> 基本计算器(经典算法150题)
### 题目描述
实现一个基本的计算器来执行字符串形式的数学表达式计算。表达式仅包含非负整数、加号 `+`、减号 `-`、乘号 `*`、除号 `/` 四种运算符和空格 ` `。整数除法仅保留整数部分。
**注意**:
- 输入保证有效且只包含上述字符。
- 输入字符串中的数字和运算符之间可能包含一个或多个空格。
- 你不能使用内置的库函数如 `eval()` 或其他内置的数学运算函数直接计算结果。
### 示例
**输入**: `"3+2*2"`
**输出**: `7`
**输入**: `" 3/2 "`
**输出**: `1`
**输入**: `" 3+5 / 2 "`
**输出**: `5`
### PHP 示例代码
```php
```
### Python 示例代码
```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 示例代码
```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 实现了基本计算器的功能,能够处理包含空格的字符串表达式,并正确执行加、减、乘、除运算。