772. Basic Calculator III
Tags:
Hard
Skills:
Stack
June 24, 2025
04:32 AM
No headings found
Loading content...
Related Posts
Leetcode
No headings found
Related Posts
Leetcode
Problem
Để giải bài toán Basic Calculator III trên LeetCode, bạn cần xây dựng một trình tính toán để đánh giá biểu thức số học chứa các phép toán cơ bản (+, -, *, /), dấu ngoặc ( và ), cùng các số nguyên không âm. Dưới đây là một số ý tưởng và cách tiếp cận:
Approach
+, -, *, /), kiểm tra độ ưu tiên của toán tử và thực hiện tính toán nếu cần.*) và chia (/) có độ ưu tiên cao hơn cộng (+) và trừ (-).nums và một toán tử từ stack ops , sau đó thực hiện phép tính tương ứngSolution
1function calculate(s: string): number {
2 const stack: (number | string)[] = []; // Ngăn xếp lưu trữ trạng thái
3 let result = 0; // Kết quả tạm thời
4 let lastNum = 0; // Số cuối cùng trong biểu thức
5 let curNum = 0; // Số hiện tại đang được xây dựng
6 let preSign = '+'; // Toán tử trước đó, mặc định là '+'
7
8 s += '+'; // Thêm dấu '+' để đảm bảo xử lý số cuối cùng
9
10 for (const c of s) {
11 if (c >= '0' && c <= '9') {
12 // Xây dựng số nguyên từ các chữ số liên tiếp
13 curNum = curNum * 10 + parseInt(c, 10);
14 }
15
16 if (c === '(') {
17 // Lưu trạng thái hiện tại vào ngăn xếp khi gặp dấu ngoặc mở
18 stack.push(result);
19 stack.push(lastNum);
20 stack.push(preSign);
21 result = 0;
22 lastNum = 0;
23 preSign = '+';
24 } else if ('+-*/)'.includes(c)) {
25 // Xử lý toán tử trước đó
26 if (preSign === '+') {
27 result += lastNum;
28 lastNum = curNum;
29 } else if (preSign === '-') {
30 result += lastNum;
31 lastNum = -curNum;
32 } else if (preSign === '*') {
33 lastNum *= curNum;
34 } else if (preSign === '/') {
35 lastNum = Math.trunc(lastNum / curNum); // Chia lấy phần nguyên
36 }
37
38 if (c === ')') {
39 // Xử lý dấu ngoặc đóng
40 curNum = result + lastNum;
41 preSign = stack.pop() as string; // Lấy toán tử trước đó từ ngăn xếp
42 lastNum = stack.pop() as number; // Lấy số cuối cùng từ ngăn xếp
43 result = stack.pop() as number; // Lấy kết quả tạm thời từ ngăn xếp
44 } else {
45 preSign = c; // Cập nhật toán tử hiện tại
46 curNum = 0; // Reset số hiện tại
47 }
48 }
49 }
50
51 return result + lastNum; // Tổng hợp kết quả cuối cùng
52}