-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathevaluate.ts
More file actions
31 lines (29 loc) · 804 Bytes
/
evaluate.ts
File metadata and controls
31 lines (29 loc) · 804 Bytes
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
/**
* (1 + ((2 + 3) * (4 * 5)))
* Dijkstra 的双栈算术表达式求值算法
*/
export default class Evaluate {
static main(args: string) {
const ops: string[] = []
const vals: number[] = []
for (let i = 0; i < args.length; i++) {
const char = args.charAt(i)
if (char.match(/\s/)) continue
if (char === '(') continue
if (['+', '-', '*', '/'].includes(char)) {
ops.push(char)
} else if (char === ')') {
const op = ops.pop()
let v = vals.pop()
if (op === '+') v = vals.pop() + v
if (op === '-') v = vals.pop() - v
if (op === '*') v = vals.pop() * v
if (op === '/') v = vals.pop() / v
vals.push(v)
} else {
vals.push(parseFloat(char))
}
}
return vals.pop()
}
}