# [227. 基本计算器 II](https://leetcode-cn.com/problems/basic-calculator-ii) [English Version](/solution/0200-0299/0227.Basic%20Calculator%20II/README_EN.md) ## 题目描述 <!-- 这里写题目描述 --> <p>给你一个字符串表达式 <code>s</code> ,请你实现一个基本计算器来计算并返回它的值。</p> <p>整数除法仅保留整数部分。</p> <div class="original__bRMd"> <div> <p> </p> <p><strong>示例 1:</strong></p> <pre> <strong>输入:</strong>s = "3+2*2" <strong>输出:</strong>7 </pre> <p><strong>示例 2:</strong></p> <pre> <strong>输入:</strong>s = " 3/2 " <strong>输出:</strong>1 </pre> <p><strong>示例 3:</strong></p> <pre> <strong>输入:</strong>s = " 3+5 / 2 " <strong>输出:</strong>5 </pre> <p> </p> <p><strong>提示:</strong></p> <ul> <li><code>1 <= s.length <= 3 * 10<sup>5</sup></code></li> <li><code>s</code> 由整数和算符 <code>('+', '-', '*', '/')</code> 组成,中间由一些空格隔开</li> <li><code>s</code> 表示一个 <strong>有效表达式</strong></li> <li>表达式中的所有整数都是非负整数,且在范围 <code>[0, 2<sup>31</sup> - 1]</code> 内</li> <li>题目数据保证答案是一个 <strong>32-bit 整数</strong></li> </ul> </div> </div> ## 解法 <!-- 这里可写通用的实现逻辑 --> 遍历字符串 s,并用变量 `preSign` 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据 `preSign` 来决定计算方式: - 加号:将数字压入栈; - 减号:将数字的相反数压入栈; - 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。 <!-- tabs:start --> ### **Python3** <!-- 这里可写当前语言的特殊实现逻辑 --> ```python class Solution: def calculate(self, s: str) -> int: num, n = 0, len(s) pre_sign = '+' stack = [] for i in range(n): if s[i].isdigit(): num = num * 10 + int(s[i]) if i == n - 1 or (not s[i].isdigit() and s[i] != ' '): if pre_sign == '+': stack.append(num) elif pre_sign == '-': stack.append(-num) elif pre_sign == '*': stack.append(stack.pop() * num) else: stack.append(int(stack.pop() / num)) pre_sign = s[i] num = 0 res = 0 while stack: res += stack.pop() return res ``` ### **Java** <!-- 这里可写当前语言的特殊实现逻辑 --> ```java class Solution { public int calculate(String s) { int num = 0; char preSign = '+'; Deque<Integer> stack = new ArrayDeque<>(); for (int i = 0, n = s.length(); i < n; ++i) { if (Character.isDigit(s.charAt(i))) { num = num * 10 + (s.charAt(i) - '0'); } if (i == n - 1 || (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ')) { switch (preSign) { case '+': stack.push(num); break; case '-': stack.push(-num); break; case '*': stack.push(stack.pop() * num); break; case '/': stack.push(stack.pop() / num); break; } preSign = s.charAt(i); num = 0; } } int res = 0; while (!stack.isEmpty()) { res += stack.pop(); } return res; } } ``` ### **...** ``` ``` <!-- tabs:end -->