227. 基本计算器 II
难度中等163收藏分享切换为英文关注反馈
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数
eval
。
思路1:
- 将表达式(中缀)转化为后缀
- 将后缀计算出结果
具体规则为:
1.中缀转后缀:
- 数字直接输出到后缀表达式
- 栈为空时,遇到运算符,直接入栈
- 遇到运算符,弹出所有优先级大于或等于该运算符的栈顶元素,并将该运算符入栈
- 将栈中元素依次出栈
例如:表达式:3+2 * 2
遇到3,直接输出到后缀表达式中,栈中元素为空,结果为: 栈: 空; 后缀表达式:3
遇到符号“+”,入栈,结果为: 栈:+ ; 后缀表达式:3
遇到2,直接输出,结果为: 栈:+; 后缀表达式: 3 2
遇到乘号*,入栈,结果为: 栈: * + ;后缀表达式:3 2
遇到2,直接输出,结果为: 栈: * + ;后缀表达式:3 2 2
最后,将元素出栈:结果为:后缀表达式:3 2 2 * +
2.计算后缀:
- 遇到数字,入栈
- 遇到运算符,弹出栈顶两个元素,做运算,并将结果入栈
- 重复上述步骤,直到表达式最右端
例如上述得到的后缀表达式为 3 2 2 * +
3 2 2 都是数字,入栈,结果为:栈:2 2 3
遇到* 号, 2 2 出栈,并计算,2*2 = 4, 4入栈,结果为:栈:4 3 ,表达式还剩一个加号
遇到+ 号,栈顶两个元素出栈并运算,4 3 做加法,4+3 =7
后缀表达式空了,计算完毕,输出结果:7
import java.util.LinkedList;
import java.util.Stack;
public class Solution{
public int calculate(String exp) {
return calRst(backTempExp(exp));
}
// 计算后缀表达式
public static LinkedList<String> backTempExp(String exp) {
Stack<String> stkEles = new Stack<String>();
LinkedList<String> tempBackExp = new LinkedList<String>();
for (int i = 0; i < exp.length(); i++) {
// 1.遇到了数字
if (Character.isDigit(exp.charAt(i))) {
// 注意多位数的获取
int k = i + 1;
for (; k < exp.length() && Character.isDigit(exp.charAt(k)); k++) {
}
tempBackExp.add(exp.substring(i, k));
i = k - 1;// 更新 i
continue;
}
// 2.遇到了乘除运算符
if (exp.charAt(i) == '/'