Stack - Cấu Trúc Dữ Liệu Kỳ Diệu Của Lập Trình Viên
đã đăng vào 4, Tháng 3, 2026, 10:36Stack là cấu trúc dữ liệu cực kỳ quan trọng trong lập trình. Khám phá các ứng dụng thú vị của stack từ call stack đến browser history!
Luyện Code Online (LCOJ) là nền tảng học lập trình trực tuyến chú trọng thực hành. Chúng tôi cung cấp kho bài tập phong phú đi kèm chức năng chấm code trực tuyến giúp người học ngay lập tức biết lời giải của mình đúng hay sai.
Hệ thống bài tập của LCOJ được phân loại chi tiết và được thiết kế để phù hợp với những bạn mới học lập trình. Hơn hết, LCOJ là miễn phí và dành cho bất kỳ ai có mong muốn học lập trình.
Còn chờ gì nữa, hãy đăng ký tài khoản. Sau đó, tham khảo lộ trình học tập rồi thử sức với bài tập đầu tiên nhé.
Với các bạn mới, hãy tham khảo lộ trình luyện tập tại LCOJ trong ảnh đính kèm bên dưới. Sau đó, hãy thử sức với 2 bài tập đầu tiên (Có hướng dẫn).
Các hành vi thiếu chuẩn mực, sử dụng các chức năng sai mục đích sẽ bị cấm vĩnh viễn
Rất mong các em chú ý để chúng ta có một môi trường học tập lành mạnh!

Stack là cấu trúc dữ liệu cực kỳ quan trọng trong lập trình. Khám phá các ứng dụng thú vị của stack từ call stack đến browser history!
LRU (Least Recently Used) là thuật toán loại bỏ dữ liệu ít được sử dụng gần đây nhất khi bộ nhớ cache đầy.
Khi bạn lướt web, trình duyệt lưu trữ các tài nguyên (JS, CSS, images). Khi cache đầy, LRU quyết định xóa resource nào không còn cần thiết.
MySQL và PostgreSQL dùng LRU để cache kết quả truy vấn, giúp truy vấn lặp lại nhanh hơn đáng kể.
Khi maxmemory đạt giới hạn, Redis dùng LRU policy để evict keys:
maxmemory 256mb
maxmemory-policy allkeys-lru
OS dùng LRU để quyết định page nào giữ trong RAM, page nào swap ra disk.
Để implement LRU cache hiệu quả, chúng ta cần 2 operations chính:
Nếu chỉ dùng 1 cấu trúc dữ liệu:
| Cấu trúc | get(key) | evict LRU |
|---|---|---|
| Array/List | O(n) | O(1) |
| HashMap | O(1) | O(n) |
| Linked List | O(n) | O(1) |
=> HashMap + Doubly Linked List cho ta O(1) cho cả 2 operations!
Khi access một key:
class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.cache = {} # key -> node
self.head = Node() # dummy head
self.tail = Node() # dummy tail
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key):
if key in self.cache:
node = self.cache[key]
self._move_to_front(node)
return node.value
return -1
def put(self, key, value):
if key in self.cache:
node = self.cache[key]
node.value = value
self._move_to_front(node)
else:
node = Node(key, value)
self.cache[key] = node
self._add_to_front(node)
if len(self.cache) > self.capacity:
lru = self.tail.prev
self._remove(lru)
del self.cache[lru.key]
def _move_to_front(self, node):
self._remove(node)
self._add_to_front(node)
Độ phức tạp: O(1) cho cả get và put
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.cache = OrderedDict()
def get(self, key):
if key in self.cache:
self.cache.move_to_end(key)
return self.cache[key]
return -1
def put(self, key, value):
if key in self.cache:
self.cache.move_to_end(key)
self.cache[key] = value
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)
| Algorithm | Pros | Cons |
|---|---|---|
| LRU | Tối ưu cho temporal locality | Overhead cao |
| LFU | Tối ưu cho frequency | Không adapt được với pattern thay đổi |
| FIFO | Đơn giản, nhanh | Không consider usage |
| Random | Rất đơn giản | Không predict được |
Đó là câu mà một senior developer tại một công ty product lớn chia sẻ với tôi tuần trước.
Anh ấy nói: "Tôi ngồi giải LeetCode mỗi ngày, leo rating Codeforces lên Candidate Master, rồi vào làm — và không một lần nào tôi cần dùng đến Segment Tree hay Dijkstra trong thực tế."
Nghe có vẻ hợp lý. Nhưng bạn có chắc anh ấy đúng không?
Hãy thành thật mà nhìn nhận:
Một khảo sát không chính thức trong cộng đồng developer Việt Nam cho thấy hơn 80% lập trình viên đi làm chưa bao giờ tự implement một thuật toán phức tạp trong môi trường production.
Vậy tại sao chúng ta vẫn học?
Đây là lập luận kinh điển mà người dạy thuật toán hay dùng.
Nghe có vẻ đúng. Nhưng tư duy giải quyết vấn đề có thật sự chỉ đến từ thuật toán không?
Một product manager giỏi cũng có tư duy hệ thống. Một designer UX cũng giải quyết vấn đề phức tạp. Một data analyst cũng phân tích logic. Họ không học BFS hay DFS.
Có lẽ "tư duy" mà chúng ta nói đến chỉ là tư duy của người đã chịu khó học một thứ khó — và thuật toán chỉ là một phương tiện, không phải con đường duy nhất.
À, đây là chỗ mọi thứ thay đổi.
Google, Meta, Amazon, Microsoft — họ hỏi thuật toán. Không phải vì thuật toán quan trọng với công việc hàng ngày, mà vì đó là bộ lọc hiệu quả nhất họ tìm được để chọn người thông minh.
Công bằng mà nói: đây là một hệ thống không hoàn hảo. Nhiều người giỏi thuật toán nhưng làm việc nhóm tệ. Nhiều người code production xuất sắc nhưng trượt phỏng vấn thuật toán. Nhưng hệ thống vẫn tồn tại — vì nó đủ tốt cho họ.
Nếu mục tiêu của bạn là Big Tech, học thuật toán là bắt buộc, dù bạn thích hay không.
Thật ra không có kết luận đơn giản, và đó mới là vấn đề.
Thuật toán là cần thiết nếu bạn:
Thuật toán có thể không cần thiết nếu bạn:
Câu hỏi thật sự là: "Bạn muốn trở thành ai?"
Nếu bạn đang đọc bài này trên LCOJ, có nghĩa là bạn đã chọn rồi — ít nhất là phần nào.
Còn bạn nghĩ sao? Học thuật toán có thật sự xứng đáng với thời gian bỏ ra không? Hay đó là một cái bẫy mà cộng đồng competitive programming đã tạo ra cho chính mình?
Để lại ý kiến của bạn phía dưới.
Chào các bạn,
Luyencode.net được xây dựng với một mục tiêu rất rõ ràng: 👉 giúp người học lập trình và thuật toán rèn luyện tư duy, nâng cao kỹ năng, và tiến bộ mỗi ngày thông qua việc luyện code thực tế.
Từ những bài toán đầu tiên cho người mới bắt đầu, đến các bài nâng cao phục vụ thi cử, phỏng vấn hay luyện tập lâu dài — chúng mình luôn cố gắng làm cho Luyencode trở thành một nền tảng dễ dùng – hữu ích – và đáng tin cậy.
Tuy nhiên, không ai hiểu trải nghiệm trên Luyencode rõ hơn chính bạn – người đang sử dụng nó mỗi ngày.
Chúng mình muốn lắng nghe trực tiếp ý kiến từ cộng đồng, để có cơ sở:
Mọi góp ý của bạn đều là dữ liệu quý giá để Luyencode ngày càng tốt hơn 🚀
Bạn có thể comment bất cứ điều gì bạn nghĩ, ví dụ như:
🧩 Bài toán
🖥️ Giao diện & trải nghiệm
⚙️ Tính năng
📈 Lộ trình học
👉 Góp ý càng cụ thể thì càng giúp chúng mình cải thiện chính xác hơn.
Dù là một ý nhỏ, một khó chịu thoáng qua, hay một đề xuất lớn — chúng mình đều rất trân trọng.
Cảm ơn bạn đã đồng hành cùng Luyencode.net ❤️ Chúc bạn học tốt và code ngày càng “mượt” hơn mỗi ngày!
— Đội ngũ Luyencode
Bạn đang chuẩn bị bắt đầu một hành trình tuyệt vời! Khóa học này được thiết kế theo phương pháp ELI5 (Explain Like I'm 5) - giải thích mọi thứ theo cách đơn giản nhất có thể, như thể bạn mới 5 tuổi!
✅ Hoàn hảo nếu bạn:
Khóa học gồm 7 phần chính được thiết kế từ dễ đến khó:
(Xem sơ đồ chi tiết phía dưới)
Mỗi bài học bao gồm:
Bạn nhận được:
Tham gia ngay tại behitek.com/beli5/python/intro/

Xin chào các bạn, blog này thông báo rằng LCOJ sẽ tiếp tục tổ chức LCOJ Regular Contest #1.
LCOJ Regular Contest #1 sẽ diễn ra vào 20h00 ngày 26/11/2023 với thời lượng kéo dài 2 giờ 30 phút (vì một số lý do liên quan trong khâu duyệt bài nên kỳ thi sẽ kéo dài thêm 30 phút đến 23h00 ngày 26/11/2023).
UPD: Sau khi contest kết thúc các bạn hoàn toán có thể đóng góp editorial cho các bài tập trong contest bằng cách comment editorial của các bạn xuống dưới bài post này với tiêu đề "Editorial - Task ...". Nếu editorial của các bạn nhận được sự ủng hộ của mọi người, lời giải của các bạn sẽ được cân nhắc để được đưa làm lời giải chính thức cùng với lời giải đến từ LCOJ ! Rất mong được cùng các bạn đóng góp lời giải cho LCOJ!
Xin chào các bạn, blog này thông báo rằng LCOJ sẽ tiếp tục tổ chức LCOJ Beginner Contest #3.
LCOJ Beginner Contest #3 sẽ diễn ra vào 20h00 ngày 05/11/2023 với thời lượng kéo dài 2 giờ 30 phút.
Đặc biệt: Kỳ thi lần này sẽ tính rate cho tất cả mọi người, bao gồm các bạn không làm bài nào vì vậy hãy cân nhắc trước khi tham gia contest.
UPD: Sau khi contest kết thúc các bạn hoàn toán có thể đóng góp editorial cho các bài tập trong contest bằng cách comment editorial của các bạn xuống dưới bài post này với tiêu đề "Editorial - Task ...". Nếu editorial của các bạn nhận được sự ủng hộ của mọi người, lời giải của các bạn sẽ được cân nhắc để được đưa làm lời giải chính thức cùng với lời giải đến từ LCOJ ! Rất mong được cùng các bạn đóng góp lời giải cho LCOJ!
UPD: Xin chúc mừng top 5 của kỳ thi:
Một contest có vẻ khó hơn khi mà số lượng các bạn làm được full AC đã ít hơn, có vẻ các thí sinh gặp rất nhiều khó khăn ở Task B và Task C, editorial sẽ có trong ngày mai hoặc nhiều ngày tới.
Xin chào các bạn,
LCOJ Beginner Contest #2 đã diễn ra vào 20h00 ngày 22/10/2023 với thời lượng kéo dài 2 giờ 30 phút.
Contest lần này có vẻ khó hơn so với LCOJ Beginner Contest #1 vì có khá ít bạn có thể hoàn thành được cả 6 task. LCOJ xin được chúc mừng top 5 của kỳ thi:
Các bài tập của kỳ thi hiện đã có mặt trong phần Danh sách bài kèm theo hướng dẫn giải (6/6).
Editorial được biên soạn bởi và sự đóng góp của top 2 kỳ thi vừa rồi . Ngoài ra với task F bạn cũng có một solution khác rất hay ở phần comment. Rất cảm ơn tất cả các bạn đã đóng góp cho Editorial của luyencode.net !
Contest tiếp theo LCOJ Beginner Contest #3 sẽ được diễn ra vào 20 giờ, ngày 5 tháng 11 năm 2023 ban tổ chức của LCOJ rất mong đông đảo các bạn người dùng LCOJ tham gia contest !
Xin chào các bạn,
Luyện Code (LCOJ) lần đầu được ra mắt cộng đồng vào tháng 10/2020 tính đến nay là gần 3 năm hoạt động. Mặc dù trải qua nhiều thăng trầm, nhưng chúng tôi đã, đang và sẽ là sân chơi trí tuệ cho các bạn trẻ trau dồi kỹ năng lập trình của mình.
Để tiếp tục sứ mệnh trên, LCOJ muốn kêu gọi cộng đồng cùng tham gia xây dựng & phát triển nền tảng để sản phẩm này phát triển & giúp ích được nhiều bạn trẻ hơn nữa. Cụ thể:
Mặc dù LCOJ đã có kho bài tập phong phú nhưng sẽ thú vị hơn rất nhiều nêú chúng ta có các cuộc thi thường xuyên hơn. Do đó, chúng mình đang tìm kiếm những ứng viên tiềm năng cùng BQT tham gia tổ chức các kỳ thi.
Chúng tôi sẵn sàng hợp tác với các tổ chức, cá nhân có mong muốn hợp tác liên quan tới sản phẩm này, bao gồm (không giới hạn):
Hãy cùng chung tay xây dựng một xã hội học tập cùng chúng tôi!
Vui lòng liên hệ với LCOJ bằng một trong các kênh liên lạc tại đây
Happy coding!
