Expression evaluation
use stack
Basic calculator
public int calculate(String s) { if (s == null || s.length() == 0) { return -1; } Stack<Integer> stack = new Stack<>(); int op = 1; int num = 0; int res = 0; int i = 0; while (i < s.length()) { char c = s.charAt(i); if (Character.isDigit(c)) { while (i < s.length() && Character.isDigit(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; i++; } res += num * op; } else if (c == '+') { op = 1; num = 0; i++; } else if (c == '-') { op = -1; num = 0; i++; } else if (c == '(') { stack.push(res); stack.push(op); res = 0; op = 1; i++; } else if (c == ')') { op = stack.pop(); num = stack.pop(); res = num + res * op; i++; } else { i++; } } return res; }
Basic calculator II
public int calculate(String s) { if (s == null || s.length() == 0) { return 0; } Stack<Integer> stack = new Stack<>(); int op = 0, num = 0; int res = 0; int i = 0; while (i < s.length()) { char c = s.charAt(i); if (Character.isDigit(c)) { num = num * 10 + s.charAt(i) - '0'; i++; } if (op == 3 || op == 4) { int t = stack.pop(); if (op == 3) res = t * num; else res = t / num; stack.push(res); } else stack.push(num); } else if (c == '+') { op = 1; stack.push(op); num = 0; i++; } else if (c == '-') { op = 2; stack.push(op); num = 0; i++; } else if (c == '*') { op = 3; num = 0; i++; } else if (c == '/') { op = 4; num = 0; i++; } else { i++; } } res = 0; while (stack.size() > 1) { int a = stack.pop(); op = stack.pop(); res = op == 1 ? res + a : res - a; } res += stack.pop(); return res; }
Evaluate Reverse Polish Notation
public int evalRPN(String[] tokens) {
if (tokens == null || tokens.length == 0) {
return 0;
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < tokens.length; i++) {
String s = tokens[i];
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
int b = stack.pop();
int a = stack.pop();
stack.push(evaluate(a, b, s));
} else {
stack.push(Integer.parseInt(s));
}
}
return stack.pop();
}
public int evaluate(int a, int b, String token) {
switch (token) {
case "+" : return a + b;
case "-" : return a - b;
case "*" : return a * b;
case "/" : return a / b;
default : return 0;
}
}
- Expression Add Operators: add operators to a string of numbers
public List<String> addOperators(String num, int target) {
List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();
dfs(res, sb, num, 0, target, 0, 0);
return res;
}
public void dfs(List<String> res, StringBuilder sb, String num, int pos, int target, long prev, long multi) {
if(pos == num.length()) {
if(target == prev) res.add(sb.toString());
return;
}
for(int i = pos; i < num.length(); i++) {
if(num.charAt(pos) == '0' && i != pos) break;
long curr = Long.parseLong(num.substring(pos, i + 1));
int len = sb.length();
if(pos == 0) {
dfs(res, sb.append(curr), num, i + 1, target, curr, curr);
sb.setLength(len);
} else {
dfs(res, sb.append("+").append(curr), num, i + 1, target, prev + curr, curr);
sb.setLength(len);
dfs(res, sb.append("-").append(curr), num, i + 1, target, prev - curr, -curr);
sb.setLength(len);
dfs(res, sb.append("*").append(curr), num, i + 1, target, prev - multi + multi * curr, multi * curr);
sb.setLength(len);
}
}
}
- Different Ways to Add Parentheses:
divide into left and right half and recursively solve
public List<Integer> diffWaysToCompute(String input) {
List<Integer> res = new ArrayList<>();
if (input.length() == 0) {
return res;
}
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '+' || c == '-' || c == '*') {
String left = input.substring(0, i);
String right = input.substring(i+1);
List<Integer> l = diffWaysToCompute(left);
List<Integer> r = diffWaysToCompute(right);
for (int a : l) {
for (int b : r) {
res.add(eval(a, b, c));
}
}
}
}
if (res.size() == 0) {
res.add(Integer.parseInt(input));
}
return res;
}
public int eval(int a, int b, char c) {
switch(c) {
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
default : return -1;
}
}