1,问题描述
224. 基本计算器
难度:困难
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
示例 2:
示例 3:
1 2
| 输入:s = "(1+(4+5+2)-3)+(6+8)" 输出:23
|
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和 ' '
组成
s
表示一个有效的表达式
- ‘+’ 不能用作一元运算(例如, “+1” 和
"+(2 + 3)"
无效)
- ‘-‘ 可以用作一元运算(即 “-1” 和
"-(2 + 3)"
是有效的)
- 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
2,初步思考
确实很难,需要使用到
3,代码处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| import java.util.*;
public class _224基本计算器 {
public int calculate_gov(String s) { Deque<Integer> ops = new LinkedList<Integer>(); ops.push(1); int sign = 1;
int ret = 0; int n = s.length(); int i = 0; while (i < n) { if (s.charAt(i) == ' ') { i++; } else if (s.charAt(i) == '+') { sign = ops.peek(); i++; } else if (s.charAt(i) == '-') { sign = -ops.peek(); i++; } else if (s.charAt(i) == '(') { ops.push(sign); i++; } else if (s.charAt(i) == ')') { ops.pop(); i++; } else { long num = 0; while (i < n && Character.isDigit(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; i++; } ret += sign * num; } } return ret; }
static Set<String> sign_set = new HashSet<>();
static { sign_set.add("+("); sign_set.add("-("); }
public int calculate_fail(String s) { char[] charArray = s.toCharArray(); Deque<String> stack = new ArrayDeque<>(); int sum = 0; String sign = "+"; Integer num = 0; StringBuilder sbTemp = new StringBuilder(); for (char c : charArray) { if (c == ' ') { continue; } else if (c != ')') { if (c >= '0' && c <= '9') { sbTemp.append(c); } else { if (!sbTemp.isEmpty()) { sbTemp.insert(0, sign); stack.add(sbTemp.toString()); sbTemp = new StringBuilder(); sign = "+"; }
if (c == '+' || c == '-') { sign = c + ""; } else { stack.add(sign + "("); } } } else { if (!sbTemp.isEmpty()) { sbTemp.insert(0, sign); stack.add(sbTemp.toString()); sbTemp = new StringBuilder(); sign = "+"; } int sumCur = 0; while (!stack.isEmpty() && !sign_set.contains(stack.peekLast())) { num = Integer.parseInt(Objects.requireNonNull(stack.pollLast())); sumCur += num; } sign = stack.pollLast(); if (sign_set.contains(("+("))) { stack.add(String.valueOf(sign_cover(sign.substring(0, 1)) * sumCur)); } } } if (!sbTemp.isEmpty()) stack.add(sbTemp.toString());
while (!stack.isEmpty()) { num = Integer.parseInt(Objects.requireNonNull(stack.pollLast())); sum += num; } return sum; }
private int sign_cover(String sign) { if (Objects.equals(sign, "+") || Objects.equals(sign, "+(")) return 1; if (Objects.equals(sign, "-") || Objects.equals(sign, "-(")) return -1; return 1; }
public static void main(String[] args) { _224基本计算器 basicCalculator = new _224基本计算器();
System.out.println(basicCalculator.calculate_fail("1-( -2)")); } }
|