Biến succ có giá trị true nếu stack khác rỗng và nội dung lấy ra là Infor. Biến succ có giá trị false nếu stack rỗng.
Thủ tục Delete-Stack cho phép lấy một phần tử ở đỉnh ngăn xếp và chứa vào biến Infox.
Thuật toán:
Procedure Delete_stack(var Infox:Element; var succ :boolean); var p: tro; begin succ := false; if Sp <> nil then begin succ := true ; p := Sp; sp := p^. Link ; Infox := p^.Info ; Dispose (p) ;
end end;
4. Ứng dụng.
ạ Chuyển đổi từ số thận phân sang hệ nhị phân.
Thuật giải: Gọi số cần chuyển là n
1. Nếu N=0kq=0 dừng
2. While N<>0 do
- Tính số dư của N chia cho 2:R - Gửi R vào ngăn xếp: Push(S,T,R) - Thay n:=n div 2
3. Hiển thị số nhị phân While stack không rỗng do
- Lấy R từ đỉnh stack: Pop(S,T,V) - Hiển thị V: write(V)
{việc chuyển đổi thuật toán thành chương trình xem như bài tập.
b. Ký pháp nghịch đảo balan
Trong hầu hết ngôn ngữ lập trình, các biểu thức số học được viết dưới dạng ký pháp trung tố (infix notation), nghĩa là mỗi ký hiệu của phép toán hai ngôi được đặt giữa các toán hạng. Tuy nhiên các bộ dịch chương trình cần tạo ra các chỉ thị máy để đánh giá các biểu thức, do vậy các biểu thức số học cần biến đổi dạng biểu diễn để việc đánh giá cơ học là dễ dàng hơn. Dạng biểu thức này còn gọi là ký pháp hậu tố (Postfix) hay tiền tố (prefix).
Ví dụ 1:
- Biểu thức trung tố: 7*(9-5)
+ Có thể biểu diễn dưới dạng hậu tố (RPN-Reverse Polish Notation-ký pháp nghịch đảo Balan) như sau: 7 9 5 - *
+ Có thể biểu diễn dưới dạng tiền tố: * 7 – 9 5
Ví dụ 2:
- Xét biểu thức trung tố: (1+5)*(8-(4-1)) - Biểu thức hậu tố tương ứng: 1 5 + 8 4 1 - - *
- Cách thức tính biểu thức hậu tố này như sau:
+ Đọc từ trái sang phải cho đến khi gặp một toán tử. Hai toán hạng cuối cùng trước toán tử này sẽ được kết hợp bởi toán tử này, (1+5=6) thay kết quả vào biểu thức ta có biểu thức RPN mới 6 8 4 1 - - *
+ Tương tự như bước 1 ta có RPN: 6 8 3 - * + Tiếp tục ta có RPN: 6 5 *
+ giá trị cuối cùng của RPN sẽ là 6*5 = 30.
Phương pháp đánh giá biểu thức RPN này đòi hỏi phải lưu trữ các toán hạng cho đến khi 1 toán tử được đọc từ trái sang phải, tại một thời điểm này 2 toán hạng cuối cùng phải được tìm ra và kết hợp với toán tử nàỵ Như vậy, phải hoạt động theo cơ chế « vào sau ra trước », nghĩa là phải dùng stack để lưu trữ các toán hạng. Cứ mỗi lần đọc được một toán tử, hai giá trị lấy ra từ ngăn xếp, sẽ được tác động bởi toán tử này, xong kết quả được đưa vào stack.
Các giải thuật liên quan.
* Thuật toán chuyển từ biểu thức trung tố sang hậu tố RPN
1. Khởi động 1 stack rỗng
2. While not(lỗi) and (chưa kết thúc biểu thức) do - đọc một phần tử của biểu thức trung tố: pt - Case pt of
+ Toán hạng: hiển thị + Toán tử:
• Nếu stack <> rỗng : Lấy và hiển thị phần tử ở đỉnh stack nếu phần tử ở đỉnh ưu tiên hơn, tiếp tục so sánh pt với phần tử ở đỉnh stack.
• Nếu stack = rỗng hay pt ưu tiên hơn phần tử ở đỉnh stack thì đẩy pt vào
stack.
+ Dấu ngoặc trái thì đẩy vào ngăn xếp.
+ Dấu ngoặc phải thì lấy và hiển thị các phần tử của stack cho đến khi gặp dấu ngoặc tráị Nếu ngăn xếp rỗng thì lỗị
3. Khi kết thúc biểu thức trung tố hiển thị các phần tử của stack cho đến khi stack rỗng.
Ví dụ 3 :
Minh họa chuyển biểu thức 7*8-(2+3).
( - * * - ( - + ( - - 7 +3) 2+3) (2+3) 8-(2+3) *8-(2+3) 7*8-(2+3) 7 7 8 7 8 * 7 8 * 2 7 8 * 2 7 8 * 2 3 + 7 8 * 2 3 * - 3)
* Thuật toán đánh giá biểu thức RPN
1 Khởi tạo Stack
2. Lặp lại cho đến khi kết thúc biểu thức RPN - Đọc phần tử của biểu thức RPN
- Nếu phần tử là toán hạng
+ Toán hạng thì đẩy nó vào stack + Toán tử :
• Lấy từ đỉnh stack 2 phần tử (nếu không chứa đủ hai phần tử thì
lỗi và dừng)
• Áp dụng toán tử cho hai giá trị vừa lấy ra
• Đẩy kết quả vào stack.
2.4.2. Hàng đợi (Queue)2.4.2.1. Định nghĩạ 2.4.2.1. Định nghĩạ
Hàng đợi là một danh sách tuyến tính mà phép thêm vào được tiến hành ở một đầu danh sách và phép loại bỏ được tiến hành ở 1 đầu còn lại của danh sách.
Hàng đợi chứa các đối tượng làm việc theo cơ chế FIFO (First In First Out) nghĩa là việc thêm một đối tượng vào hàng đợi hoặc lấy một đối tượng ra khỏi hàng đợi được thực hiện theo cơ chế "Vào trước ra trước".
Hàng đợi
2.4.2.2. Biểu diễn hàng đợịạ Biểu diễn dùng mảng: ạ Biểu diễn dùng mảng:
Ta có thể tạo một hàng đợi bằng cách sử dụng một mảng 1 chiều với kích thước tối đa là N (ví dụ, N có thể bằng 1000). Dùng 2 biến F, R để trỏ đến đầu loại bỏ và đầu bổ sung của queuẹ
Trạng thái hàng đợi lúc bình thường:
Q – biến hàng đợi, f quản lý đầu hàng đợi, r quản lý phần tử cuối hàng đợị
b. Dùng danh sách liên kết
Ta có thể tạo một hàng đợi bằng cách sử dụng một danh sách liên kết đơn.
Ta khai báo: Type
Nut = record info : Element; Link : tro; End;
Var Front, Rear :ref;
2.4.2.3. Các thao tác.
ạ Dùng cấu trúc mảng để biểu diễn hàng đợị * Các phép toán.