题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
样例描述
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
思路
表达式求值 (通用模板题)
- 维护一个栈,如果遇到数就直接压入栈。遇到左括号也压入栈,遇到右括号将左括号之前的全算完。
- 遇到运算符的话,首先定义运算符的优先级如下,保证能够区分即可。
如果当前运算符优先级小于等于栈顶优先级,则计算栈顶,算完会有新的栈顶,然后压入栈中(继续比较然后计算,while循环过程)
如果当前运算符大于栈顶优先级,则压入栈中。
表达式求值的通用模板的整体流程如下:
- 由于数和字符的类型不一样,需要用两个栈表示。一个存数,一个存运算符。
- 细节由于第一个数可能是负数,为了减少边界判断。先往 nums 添加一个 0。(也可以开始直接给s加个括号,然后变成下面的细节处理,在循环逻辑中处理掉)
- 细节防止 () 内出现的首个字符为运算符,将所有的空格去掉,并将 (- 替换为 (0-,(+ 替换为 (0+,在循环中处理这个细节。
- java函数名过长,为方便可以封装Character.isDigit这个方法,可以将字符串转化为字符数组方便索引里面的值。
代码
class Solution {
Deque<Integer> nums = new LinkedList<>();
Deque<Character> ops = new LinkedList<>();
public int calculate(String s) {
// //防止第一个数是负数,先加入一个0