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