表达式求值
大约 2 分钟
表达式求值
- OI Wiki: https://oi-wiki.org/misc/gray-code/
题目 | 难度 | |
---|---|---|
150. 逆波兰表达式求值 | 中等 | |
224. 基本计算器 | 困难 | |
227. 基本计算器 II | 中等 | |
$772. 基本计算器 III | 困难 | |
770. 基本计算器 IV | 困难 | TODO |
定于
表达式包含两类字符:运算数和运算符。对于长度为 n
的表达式,借助合适的分析方法,可以在 O(n)
的时间复杂度内完成分析与求值。
150. 逆波兰表达式求值
tokens[i]
是一个算符("+"
、"-"
、"*"
或 "/"
),或是在范围 [-200, 200]
内的一个整数
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution150 {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new ArrayDeque<>();
for (String token : tokens) {
if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(calculate(num2, num1, token));
} else {
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
private int calculate(int num1, int num2, String operator) {
switch (operator) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
return 0;
}
}
}
224. 基本计算器
s
由数字、'+'
、'-'
、'('
、')'
、和 ' '
组成。
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution224 {
public int calculate(String s) {
int len = s.length();
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
int sign = 1;
int res = 0;
int idx = 0;
while (idx < len) {
if (s.charAt(idx) == ' ') {
idx++;
} else if (s.charAt(idx) == '+') {
sign = stack.element();
idx++;
} else if (s.charAt(idx) == '-') {
sign = -stack.element();
idx++;
} else if (s.charAt(idx) == '(') {
stack.push(sign);
idx++;
} else if (s.charAt(idx) == ')') {
stack.pop();
idx++;
} else {
long num = 0;
while (idx < len && Character.isDigit(s.charAt(idx))) {
num = num * 10 + (s.charAt(idx) - '0');
idx++;
}
res += sign * num;
}
}
return res;
}
}
227. 基本计算器 II
s
由整数和算符 ('+'
, '-'
, '*'
, '/'
) 组成,中间由一些空格
隔开。
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution227 {
public int calculate(String s) {
int len = s.length();
Deque<Integer> stack = new ArrayDeque<>();
char sign = '+';
int num = 0;
for (int i = 0; i < len; i++) {
if (Character.isDigit(s.charAt(i))) {
num = num * 10 + (s.charAt(i) - '0');
}
if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == len - 1) {
if (sign == '+') {
stack.push(num);
} else if (sign == '-') {
stack.push(-num);
} else if (sign == '*') {
stack.push(stack.pop() * num);
} else if (sign == '/') {
stack.push(stack.pop() / num);
}
sign = s.charAt(i);
num = 0;
}
}
int res = 0;
while (!stack.isEmpty()) {
res += stack.pop();
}
return res;
}
}
$772. 基本计算器 III
s
由整数、'+'
、'-'
、'*'
、'/'
、'('
和 ')'
组成。
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution772 {
public int calculate(String s) {
return dfs(s, 0)[0];
}
private int[] dfs(String s, int begin) {
int len = s.length();
Deque<Integer> stack = new ArrayDeque<>();
char sign = '+';
int num = 0;
int[] result = new int[2];
for (int i = begin; i < len; i++) {
char ch = s.charAt(i);
if (Character.isDigit(ch)) {
num = num * 10 + (s.charAt(i) - '0');
} else if (ch == '(') {
int[] numNext = dfs(s, i + 1);
num = numNext[0];
// i 会突变
i = numNext[1];
}
if (!Character.isDigit(ch) && ch != '(' || i == len - 1) {
if (sign == '+') {
stack.push(num);
} else if (sign == '-') {
stack.push(-num);
} else if (sign == '*') {
stack.push(stack.pop() * num);
} else if (sign == '/') {
stack.push(stack.pop() / num);
}
if (ch == ')') {
result[1] = i;
break;
}
sign = s.charAt(i);
num = 0;
}
}
while (!stack.isEmpty()) {
result[0] += stack.pop();
}
return result;
}
}
(全文完)