文章目录
- 题目解析
- 解题
- 小结
题目解析
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 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 整数
下面是题目的链接:
基本计算器||
- 解析:
因为给定的是一个字符串s ,所以要想遍历字符串,先要将它转化成一个字符数组。我们要利用栈的性质来进行模拟算术运算,因为只有加减乘除,所以乘除的优先级是高的。先定义一个变量 op 表示运算符,当我们遇到加号和减号时,直接将加号或减号前的数字压入栈中。为了方便最后的计算,当遇到是减号时,压入栈中的数字是负的即可,这样,最后计算时,全部相加在一起就可以了。当我们遇到乘除时,将栈顶元素弹出和下一个数运算即可。还有一点,当遇到不是个位数时,我们需要继续往后遍历,tmp * 10+ss[ i ] 就可以解决这个问题。
值得注意的是,当遇到空格时,直接 i++ 就可以跳过了。
解题
class Solution {public int calculate(String s) {char op = '+';Stack<Integer> ret = new Stack<>();int n = s.length();char[] ss = s.toCharArray();int i = 0;while (i < n){if (ss[i] == ' '){i++;} else if (ss[i] >= '0' && ss[i] <= '9') {int tmp = 0;while (i < n && ss[i] >= '0' && ss[i] <= '9'){tmp = tmp * 10 + (ss[i] - '0');i++;}if (op == '+'){ret.push(tmp);} else if (op == '-') {ret.push(-tmp);}else if (op == '*'){ret.push(ret.pop()*tmp);}else {ret.push(ret.pop()/tmp);}}else {op = ss[i];i++;}}int sum = 0;while (!ret.isEmpty()){sum += ret.pop();}return sum;}}
小结
对于这种模拟运算的题,都可以使用栈的优先级特性来进行解决。