Trong phần này, ta sẽ sử dụng các lớp đối tượng đã được cài đặt trong chương này: ngăn xếp, hàng đợi, danh sách liên kết, cây nhị phân và đồ thị.
Chương trình 5.8 cài đặt một chương trình tổng hợp, sử dụng menu cho các đối tượng: stack, queue, list. Với mỗi đối tượng, có một menu con tương ứng với các thao tác trên đối tượng đó. Với các đối tượng còn lại, được coi như bài tập mở rộng của phần này.
132
Chương trình 5.8
package vidu.chuong5; public class CaseStudy3{
public static void main(String[] args) { try {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in)); while (true) {
System.out.println("**********************************"); System.out.println(" CASE STUDY 3 "); System.out.println(" ---o0o--- "); System.out.println("
1. Thao tac voi ngan xep ");
System.out.println("
2. Thao tac voi hang doi ");
System.out.println(" 3.
Thao tac voi danh
sach ");
System.out.println(" 10.Thoat!
System.out.println("******************************* ***");
System.out.print(" |==> Chon chuc nang: ");
");
int function = Integer.parseInt(br.readLine()); CaseStudy3 ob3 = new CaseStudy3();
switch(function){
case 1: // Thao tác với ngăn xếp ob3.stack(br);
break;
case 2: // Thao tác với hàng đợi ob3.queue(br);
break;
case 3: // Thao tác với danh sách ob3.list(br);
break;
case 10: // Thoát khỏi chương trình System.exit(1);
} }
133
}
catch(Exception ex) {
System.out.println("Loi o ham 'main': "); ex.printStackTrace();
} }
/* Thao tác với ngăn xếp */
public void stack(BufferedReader br){ MyStack stack = new MyStack(); try {
while (true) {
System.out.println("**********************************"); System.out.println("
THAO TAC VOI NGAN
XEP ");
System.out.println(" ---o0o--- "); System.out.println("
1. Them mot phan tu vao stack ");
System.out.println(" 2.
Lay mot phan tu ra khoi stack ");
System.out.println(" 3.
Lay het cac phan tu cua stack ");
System.out.println(" 10.Thoat! "); System.out.println("**********************************");
System.out.print(" |==> Chon chuc nang: "); int function = Integer.parseInt(br.readLine()); switch(function){
case 1: // Thêm một phần tử vào ngăn xếp
System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine()); stack.push(new Node(phantu));
break;
case 2: // Lấy một phần tử ra khỏi ngăn xếp Node node = stack.pop();
if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
134
break;
case 3: // Lấy tất cả các phần tử của ngăn xếp System.out.println(“Cac phan tu cua ngan xep:”); while(true){
Node node = stack.pop(); if(node == null)
break;
System.out.print(“ ” + node.getValue()); }
break;
case 10: // Thoát khỏi chương trình con return; } } } catch(Exception ex) { ex.printStackTrace(); } }
public void queue(BufferedReader br){ MyQueue queue = new MyQueue(); try {
while (true) {
System.out.println("**********************************"); System.out.println
("
THAO TAC VOI HANG
DOI ");
System.out.println(" ---o0o--- "); System.out.println
(" 1. Them mot phan tu vao queue "); System.out.println
(" 2. Lay mot phan tu ra khoi queue "); System.out.println
(" 3.
Lay het cac phan tu cua queue ");
System.out.println(" 10.Thoat! "); System.out.println("********************************** ");
System.out.print("
|==> Chon chuc nang: ");
135
switch(function){
case 1: // Thêm một phần tử vào hàng đợi
System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine()); queue.insert(new Node(phantu));
break;
case 2: // Lấy một phần tử ra khỏi hàng đợi Node node = queue.remove();
if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
System.out.println(“Khong co phan tu nao!”); break;
case 3: // Lấy tất cả các phần tử của hàng đợi System.out.println(“Cac phan tu cua hang doi:”); while(true){
Node node = queue.remove(); if(node == null)
break;
System.out.print(“ ” + node.getValue()); }
break;
case 10: // Thoát khỏi chương trình con return; } } } catch(Exception ex) { ex.printStackTrace(); } }
/* Thao tác với danh sách liên kết đơn */ public void list(BufferedReader br){
136
try {
while (true) {
System.out.println("**********************************"); System.out.println(" THAO TAC VOI DANH SACH DON "); System.out.println(" ---o0o--- ");
System.out.println(" 1. Them mot phan tu vao list "); System.out.println(" 2. Lay mot phan tu ra khoi list "); System.out.println(" 3. Duyet cac phan tu cua list "); System.out.println(" 10.Thoat! "); System.out.println("******************************* ***"); System.out.print(" |==> Chon chuc nang: "); int function = Integer.parseInt(br.readLine()); switch(function){
case 1: // Thêm một phần tử vào danh sách System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine()); System.out.print(“Vi tri chen phan tu:”); int vitri = Integer.parseInt(br.readLine()); list.insert(new Node(phantu), vitri); break;
case 2: // Lấy một phần tử ra khỏi danh sách System.out.print(“Vi tri phan tu lay ra:”); int vitri = Integer.parseInt(br.readLine()); SimpleNode node = list.remove(vitri); if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
System.out.println(“Khong co phan tu nao!”); break;
case 3: // Lấy tất cả các phần tử của danh sách System.out.println(“Cac phan tu cua danh sach:”); Node[] nodes = list.travese(); for(int i=0; i<nodes.length; i++)
System.out.print(“ ” + nodes[i].getValue()); break;
137
case 10: // Thoát khỏi chương trình con return; } } } catch(Exception ex) { ex.printStackTrace(); } } } TỔNG KẾT CHƯƠNG 5
Nội dung chương 5 đã trình bày việc biểu diễn và cài đặt một số cấu trúc dữ liệu trừu tượng trên Java, bao gồm các giải thuật:
Phương pháp duyệt Phương pháp đệ qui Phương pháp sắp xếp Phương pháp tìm kiếm.
Và các cấu trúc dữ liệu trừu tượng: Ngăn xếp (stack)
Hàng đợi (queue)
Danh sách liên kết (list): danh sách liên kết đơn và danh sách liên kết kép. Cây nhị phân (binary tree)
Đồ thị (graph): đồ thị không trọng số và đồ thị có trọng số.
Hơn nữa, chương này cũng đã trình bày và minh hoạ cách sử dụng các đối tượng trừu tượng trong các ứng dụng.
CÂU HỎI VÀ BÀI TẬP CHƯƠNG 5
Cài đặt bổ sung các phương thức sắp xếp khác vào lớp Array trong mục 5.2.1: Sắp xếp nổi bọt
Sắp xếp chọn. Sắp xếp vun đống
138
Chuyển lớp MyStack trong mục 5.3.1 thành một ngăn xếp của các kí tự. Sau đó, dùng lớp ngăn xếp mới đó để đảo ngược một xâu kí tự do người dùng nhập vào từ bàn phím.
Dùng lớp MyQueue để mô phỏng chương trình quản lí tiến trình đơn giản của hệ điều hành:
Mỗi tiến trình được mã hoá bằng một kí hiệu có kiểu int. Khi một tiến trình xuất hiện, nó sẽ được đưa vào một hàng đợi. Khi CPU rỗi, một tiến trình trong hàng đợi sẽ được lấy ra thực hiện. Yêu cầu viết menu thực hiện chương trình:
Thêm một tiến trình Lấy một tiến trình ra
Xem tất cả các tiến trình đang có mặt trong hàng đợi.
Thay đổi cấu trúc lớp Node của danh sách liên kết, sao cho value có kiểu là lớp Employee đã được định nghĩa trong chương 4.
Dùng danh sách liên kết đơn với cấu trúc mới trong bài 4 để quản lí nhân viên của một công ty: Thêm vào một nhân viên, xoá đi một nhân viên, tìm kiếm một nhân viên theo một tiêu chí cụ thể (tiền lương, tuổi…), duyệt tất cả các nhân viên.
Dùng danh sách liên kết kép để thực hiện bài số 5.
Viết chương trình (dạng menu) để áp dụng thực hiện các thao tác trên cây nhị phân, sử dụng lớp BinaryTree trong mục 5.5.
Viết chương trình (dạng menu) để áp dụng thực hiện các thao tác trên đồ thị không trọng số, sử dụng lớp Graph trong mục 5.6.1.
Viết chương trình (dạng menu) để áp dụng thực hiện các thao tác trên đồ thị có trọng số, sử dụng lớp WeightedGraph trong mục 5.6.2.