KIỂU DỮ LIỆU STACK VÀ QUEUE Nguyễn Thế Anh
Ngoài các kiểu dữ liệu chuẩn như array, string,… mà PASCAL hỗ trợ thì còn có các kiểu dữ liệu trừu tượng khác trong đó 2 kiểu dữ liệu STACK và QUEUE có ứng dụng rất rộng rãi Hôm nay tôi xin giới thiệu với các bạn chi tiết về 2 kiểu dữ liệu này.
I Stack (Ngăn xếp)
Đây là kiểu dữ liệu mà việc cập nhật và truy nhập nó đều theo nguyên tắc ″Vào sau ra trước″(Last In, Firt Out viết tắt là LIFO) Ta có thể hình dung Stack là một mảng, một chiều mà việc truy nhập và cập nhật nó đều diễn ra ở một đầu của mảng Sau đây là mô tả quy tắc hoạt động của Stack:
Ta dùng mảng Stack[I Nmax] mà ″đáy″ của Stack là ở đầu tức chỉ số là 1 Việc đưa vào (Push) hay lấy ra (Pop) được thực hiện phần đuôi của mảng nhờ một con trỏ P Các thao tác đưa vào hay lấy ra đó ứng với các thủ tục hàm thích hợp Giả sử Stack chứa các phần tử là các số nguyên thì ta sẽ có các thủ tục và hàm sau: Procedure Push (N:Integer); {Đưa số N vào Stack}
Begin Inc (P); Stack[P]:=N; End;
Function Pop: Integer;
{Lấy 1 phần tử ra khởi stack}
Trang 2II Queue (Hàng đợi)
Khác với Stack, Queue là một kiểu dữ liệu trừu tượng mà cơ chế cập nhật và truy xuất xảy ra ở hai đầu khác nhau và theo quy tắc vào trước ra trước (First In − First Out viết tắt là FIFO) Nếu có thể xác định được kích cỡ cần đến của Queue ta có thể dùng một mảng tĩnh (thay cho một xâu liên kết động) để mô phỏng Queue theo đó, đầu trái của mảng là đầu ra (dùng con trỏ l) và đầu phải của mảng là đầu vào (dùng con trỏ r) tương ứng với thủ tục Put, hàm Get và một hàm Qfull kiểu Boolean để thông báo Queue đầy hay chưa.
Giả sử mảng mô phỏng Queue là Q:
Procedure Put (NewOb:Td); {Đưa vào hàng đợi }
Trang 3QFull : = r – 1 > SizeQ; End;
ứng dụng quan trọng của Queue là giúp giải pháp ″Loang″ hay tìm kiếm theo chiều rộng.
Ví dụ: Trên bàn cờ vua quốc tế N*N ( n≤ 50) trong đó có một số ô có mìn Từ một ô không có mìn cho trước
con mã có thể đi đến một ô khác được hay không Nếu được hãy chỉ ra đường đi ngắn nhất.
File dữ liệu:
- Dòng 1 là N (kích thước bàn cờ).
- Dòng thứ nhất trong số N dòng tiếp theo:
* đầu tiên là K số mìn trên dòng đó, tiếp theo là K số, mỗi số là chỉ số cột có mìn.
+ A[i,j] = 0 nếu ô (i,j) có mìn.
+ A[i,j] = 1 nếu ô (i,j) không có mìn và mã chưa đến + A[i,j]= k (k>1) nếu ô (i,j) là bước thứ k của con mã Put(ô xp); {đưa vào hàng đợi toạ độ ô xuất phát} Nhan { ô xp }: = 0; {khởi tạo nhãn của ô xuất phát} Until Nhan [ô i] = 0;
Dưỡi đây là toàn bộ chương trình:
Trang 4Function Thuchienduoc: Boolean; {Kiểm tra xem có đường di hay không} Var co,oo1: oco; i:Byte;d,c :Integer;
Trang 5If (1 ≤ dx) and (dx ≤n) and (1≤ cx) and (cx ≤n) then If A {d,c} = A{x,cx}+1 then Break;
Trang 6Writeln (′ Kich thuoc ban co la′ , n,′ x′ , n) ;Writeln (′ 0 xuat phat : (′ , d1,′ ′ , c1,′ )′ ) ; Write (′ 0 can toi: ′ ); Readln (d2, c2);