1
+ // 227. 基本计算器 II
2
+
3
+
4
+ /*
5
+ 在“224. 基本计算器”的基础上进阶
6
+ 1、支持 + - * / ^ % ( ) 的完全表达式问题
7
+ 2、用map存放运算符的优先级,只有「栈内运算符」比「当前运算符」优先级高或同等,才能进行运算
8
+ */
9
+ class Solution {
10
+ Map <Character , Integer > map = new HashMap <>(){{
11
+ put ('+' , 1 );
12
+ put ('-' , 1 );
13
+ put ('*' , 2 );
14
+ put ('/' , 2 );
15
+ put ('%' , 2 );
16
+ put ('^' , 3 );
17
+ }};
18
+
19
+ public int calculate (String s ) {
20
+ Deque <Character > opsStack = new ArrayDeque <>();
21
+ Deque <Integer > numsStack = new ArrayDeque <>();
22
+ numsStack .push (0 );
23
+ s = s .replaceAll (" " , "" );
24
+ int n = s .length ();
25
+ char [] charArray = s .toCharArray ();
26
+ for (int i = 0 ; i < n ; i ++) {
27
+ char c = charArray [i ];
28
+ if (c == '(' ) {
29
+ opsStack .push (c );
30
+ } else if (c == ')' ) {
31
+ while (!opsStack .isEmpty () && opsStack .peek () != '(' ) {
32
+ cal (numsStack , opsStack );
33
+ }
34
+ opsStack .pop ();
35
+ } else if (Character .isDigit (c )) {
36
+ int j = i , num = 0 ;
37
+ while (j < n && Character .isDigit (charArray [j ])) {
38
+ num = num * 10 + charArray [j ++] - '0' ;
39
+ }
40
+ numsStack .push (num );
41
+ i = j - 1 ;
42
+ } else {
43
+ if (i > 0 && charArray [i - 1 ] == '(' ) {
44
+ numsStack .push (0 );
45
+ }
46
+ while (!opsStack .isEmpty () && opsStack .peek () != '(' && map .get (opsStack .peek ()) >= map .get (c )) {
47
+ cal (numsStack , opsStack );
48
+ }
49
+ opsStack .push (c );
50
+ }
51
+ }
52
+ while (!opsStack .isEmpty ()) {
53
+ cal (numsStack , opsStack );
54
+ }
55
+ return numsStack .peek ();
56
+ }
57
+
58
+ private void cal (Deque <Integer > numsStack , Deque <Character > opsStack ) {
59
+ if (numsStack .isEmpty () || numsStack .size () < 2 || opsStack .isEmpty ()) {
60
+ return ;
61
+ }
62
+ int b = numsStack .pop (), a = numsStack .pop ();
63
+ char op = opsStack .pop ();
64
+ int res = 0 ;
65
+ if (op == '+' ) {
66
+ res = a + b ;
67
+ } else if (op == '-' ) {
68
+ res = a - b ;
69
+ } else if (op == '*' ) {
70
+ res = a * b ;
71
+ } else if (op == '/' ) {
72
+ res = a / b ;
73
+ } else if (op == '%' ) {
74
+ res = a % b ;
75
+ } else if (op == '^' ) {
76
+ res = (int ) Math .pow (a , b );
77
+ }
78
+ numsStack .push (res );
79
+ }
80
+ }
0 commit comments