- top() – Lấy phần tử trên cùng - top kiến tạo ngoại hạng anh 2025
]( "Giới Thiệu Bài Toán") Giới Thiệu Bài Toán
Thiết kế một ngăn xếp hỗ trợ các thao tác đẩy, lấy ra, xem phần tử trên cùng và truy xuất phần tử nhỏ nhất trong thời gian hằng số.
push(x)
– Thêm phần tử x vào ngăn xếp.pop()
– Loại bỏ phần tử trên cùng của ngăn xếp.top()
– Lấy phần tử trên cùng.getMin()
– Truy xuất phần tử nhỏ nhất trong ngăn xếp.
[Ví Dụ]
Ví dụ 1:
112345678910111213141516
| ``` Đầu vào["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]Đầu ra[null,null,null,null,-3,null,0,-2]Giải thíchMinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); // Trả về -3minStack.pop();minStack.top(); // Trả về 0minStack.getMin(); // Trả về -2
1
2---|---
3## ]( "Phân Tích Ngắn Gọn") Phân [tin tức the thao bóng đá](/post/86bc44283d5b75d2.html) Tích Ngắn Gọn
4Ngày nay hầu hết các ngôn ngữ lập trình đều có sẵn cấu trúc dữ liệu kiểu ngăn xếp. Java cũng cung cấp cấu trúc `stack`. Tuy nhiên, thách thức chính của bài toán này là làm thế nào để lấy giá trị nhỏ nhất trong thời gian hằng số. Ban đầu, bạn có thể nghĩ đến việc sử dụng một biến đơn lẻ để theo dõi giá trị nhỏ nhất. Nhưng điều này không khả thi vì khi các phần tử bị loại bỏ khỏi ngăn xếp, giá trị nhỏ nhất cũng có thể thay đổi. Vì vậy, giải [Live Casino](/post/7aee9b0987602201.html) pháp hợp lý là sử dụng một **ngăn xếp phụ**.
5
6## [Mã Nguồn]
123456789101112131415161718192021222324252627282930313233343536373839
1| ```
2class MinStack { // Đây là ngăn xếp chính Stack<Integer> s1 = new Stack<>(); // Đây là ngăn xếp phụ, lưu trữ các giá trị nhỏ nhất Stack<Integer> s2 = new Stack<>(); /** Khởi tạo cấu trúc dữ liệu ở đây */ public MinStack() { } public void push(int x) { // Thêm phần tử vào ngăn xếp chính s1.push(x); // Khi s2 rỗng hoặc giá trị hiện tại nhỏ hơn hoặc bằng giá trị đỉnh của s2, thêm vào s2 // Lưu ý rằng dấu "bằng" rất quan trọng, bởi vì nếu có nhiều phần tử nhỏ nhất giống nhau, // chúng cần được thêm vào ngăn xếp phụ để đảm bảo tính chính xác khi pop if (s2.isEmpty() || x <= s2.peek()) { s2.push(x); } } public void pop() { // Trước tiên, phải loại bỏ phần tử từ ngăn xếp chính, sau đó kiểm tra với s2 // Nếu không có dấu "bằng" trong quá trình push trước đó, thì lúc này có thể xảy ra lỗi khi pop int x = s1.pop(); if (x == s2.peek()) [tin tuc the thao trong nuoc](/post/a826427.html) { s2.pop(); } } public int top() { // Phần tử trên cùng của ngăn xếp chính return s1.peek(); } public int getMin() { // Phần tử trên cùng của ngăn xếp phụ chứa giá trị nhỏ nhất return s2.peek(); } }