Triển khai ngăn xếp bằng hàng đợi
Nguồn: Hackernoon Nội dung của bài viết này được dành để giải quyết vấn đề triển khai một ngăn xếp chỉ sử dụng hai hàng đợi. Chúng tôi gặp sự cố với Leetcode :
Triển khai ngăn xếp vào trước ra trước (LIFO) chỉ bằng hai hàng đợi. Ngăn xếp được triển khai phải hỗ trợ tất cả các chức năng của ngăn xếp thông thường ( push , top , pop vàempty ). Triển khai lớp MyStack:
Chi tiết bổ sung:
Ví dụ 1: Đầu vào
đầu ra
[không, không, không, 2, 2, sai]
Giải trình
|
Giải pháp của vấn đề
Lựa chọn đầu tiên
Trong giải pháp đầu tiên, chúng tôi sẽ sử dụng bộ nhớ bổ sung:static class MyStack {
private Queue<Integer> current;
private Queue<Integer> tmp;
public MyStack() {
current = new ArrayDeque<>();
tmp = new ArrayDeque<>();
}
Chúng tôi cần một hàng đợi bổ sung cho giải pháp này. Hãy bắt đầu với đẩy . Đối với thao tác đẩy , chúng ta chỉ cần thêm một phần tử mới vào hàng đợi hiện tại.
public void push(int x) {
current.add(x);
}
Bí quyết chính ở đây là phương pháp pop . Ở đây chúng tôi đặt tất cả các phần tử ngoại trừ phần tử cuối cùng vào hàng đợi tmp . Và bây giờ phần tử cuối cùng trong hàng đợi sẽ trở thành phần tử đầu tiên được gửi.
public int pop() {
if (current.isEmpty()){
return -1;
}
int size = current.size();
for (int i = 0; i < size - 1; i ++){
tmp.add(current.poll());
}
int ret = current.poll();
current = tmp;
return ret;
}
Còn phương pháp hàng đầu thì sao ? Phương pháp này tương tự như pop :
public int top() {
if (current.isEmpty()){
return -1;
}
int size = current.size();
for (int i = 0; i < size - 1; i ++){
tmp.add(current.poll());
}
int ret = current.peek();
tmp.add(current.poll());
current = tmp;
return ret;
}
Và đối với phương thức trống cuối cùng , chúng ta chỉ cần kiểm tra hàng đợi hiện tại:
public boolean empty() {
return current.isEmpty();
}
Giải pháp thứ hai
Trong tùy chọn này, chúng tôi sẽ không sử dụng bộ nhớ bổ sung:static class MyStack {
private Queue<Integer> current;
public MyStack2() {
current = new ArrayDeque<>();
}
}
Ý tưởng chính ở đây là phương pháp đẩy . Chúng ta thêm phần tử hiện tại và sau đó di chuyển các phần tử trước phần tử hiện tại đến cuối hàng đợi. Ví dụ: nếu chúng ta có một hàng đợi có các phần tử [2,1], chúng ta sử dụng push 3 - và nhận hàng đợi [3,2,1], sau đó là [1,3,2], [2,1,3] và. .. và tất cả.
public void push(int x) {
current.add(x);
int size = current.size();
for (int i = 0; i < size-1; i ++){
current.add(current.poll());
}
}
Ở đây chúng ta đã có phần tử chính xác và phần đầu của hàng đợi cho tất cả các phương thức khác.
public int pop() {
return current.poll();
}
public int top() {
return current.peek();
}
public boolean empty() {
return current.isEmpty();
}
Các phương thức lớp Toán Java
Nguồn: Medium Trong bài đăng này, bạn sẽ tìm hiểu về các khả năng và phạm vi của lớp Java Math. Một phần của gói Java.lang.Math trong ngôn ngữ Java là lớp Math . Lớp này cung cấp cho chúng ta một số phương thức được xác định trước như min , max , sqrt và các phương thức khác. Dưới đây là ví dụ về một số phương pháp của lớp Toán mà chúng ta có thể sử dụng trong công việc hàng ngày. 1. Phương thức max() trả về số lớn hơn được truyền trong tham số:System.out.println(Math.max(5,3));
OUTPUT: 5
2. Phương thức sqrt() sẽ hiển thị cho chúng ta căn bậc hai của số được truyền dưới dạng đối số:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. Phương thức Random() trả về một số ngẫu nhiên trong phạm vi từ 0 đến 1.
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. Phương thức abs() trả về giá trị dương tuyệt đối của bất kỳ số âm nào. Ví dụ: nếu chúng ta chuyển nó là 0 thì kết quả là nó sẽ trả về 0.
System.out.println(Math.abs(-4));
OUTPUT: 4
System.out.println(Math.abs(4));
OUTPUT: 4
System.out.println(Math.abs(0));
OUTPUT: 0
5. Phương thức Floor() trả về một giá trị kép nhỏ hơn hoặc bằng đối số và bằng số nguyên toán học gần nhất.
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
GO TO FULL VERSION