227. 基本计算器 II

题目#

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

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

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1]
  • 题目数据保证答案是一个 32-bit 整数

思路#

利用一个栈,将所有运算都转化为加法运算,减法转化为负数的加法,乘除直接运算。

之后将栈内元素相加就是结果了。

代码#

import "unicode"
func calculate(s string) int {
stack := []int{}
op := '+'
num := 0
// 将减法转化为负数的加法
// 直接处理乘除
for i, val := range s {
// 比如 12, 1*10 + 2
if unicode.IsDigit(rune(val)) {
num = num*10 + int(val-'0')
}
// 非数字且非空格,即 +-*/,处理
// 最后一个数字,需要加入栈中
if !unicode.IsDigit(rune(val)) && val != ' ' || i == len(s)-1 {
if op == '+' {
stack = append(stack, num)
} else if op == '-' {
// 减法变成加负数
stack = append(stack, -num)
} else if op == '*' {
// 乘除优先级高,算一下
stack[len(stack)-1] = stack[len(stack)-1] * num
} else if op == '/' {
stack[len(stack)-1] = stack[len(stack)-1] / num
}
// 改变运算符
op = val
// 清零
num = 0
}
}
res := 0
// 加法,获取结果
for _, val := range stack {
res += val
}
return res
}
Last updated on