BÁO CÁO BÀI TIỂU LUẬN ĐÊ TÀI NGĂN XẾP,HÀNG ĐỢI TÍNH GIÁ TRỊ BIỂU THỨC THEO PHƯƠNG PHÁP NGHỊCH ĐẢO BA LAN

25 816 2
BÁO CÁO BÀI TIỂU LUẬN ĐÊ TÀI NGĂN XẾP,HÀNG ĐỢI TÍNH GIÁ TRỊ BIỂU THỨC THEO PHƯƠNG PHÁP NGHỊCH ĐẢO BA LAN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC PHÚ YÊN KHOA KỸ THUẬT – CÔNG NGHỆ  BÁO CÁO BÀI TIỂU LUẬN ĐÊ TÀI: NGĂN XẾP,HÀNG ĐỢI TÍNH GIÁ TRỊ BIỂU THỨC THEO PHƯƠNG PHÁP NGHỊCH ĐẢO BA LAN GIÁO VIÊN HƯỚNG DẪN: TRẦN MINH CẢNH SINH VIÊN THỰC HIỆN : NHÓM LỚP : ĐẠI HỌC SƯ PHẠM TIN HỌC – C13 MÔN HỌC : CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN LỜI MỞ ĐẦU Cấu trúc liệu thuật toán môn học sinh viên ngành Công nghệ thông tin Các cấu trúc liệu giải thuật xem yếu tố quan trọng lập trình, câu nói nỗi tiếng Niklaus Wirth: Chương trình= Cấu trúc liệu + Giải thuật (Programs=Data Structures+ Algorithms) Nắm vững cấu trúc liệu giải thuật sở để sinh viên tiếp cận với việc thiết kế xây dựng phần mềm sử dụng công cụ lập trình đại Hai cấu trúc liệu gần gũi với hoạt đọng thực tế, ngăn xếp hàng đợi Ngăn xếp dạng đặc biệt danh sách mà việc bổ sung hay loại bỏ phần tử thực đầu danh sách Ngăn xếp gọi kiểu liệu có nguyên tắc LIFO (Last In First Out- Vào sau trước) Hàng đợi cấu trúc liệu gần giống với ngăn xếp, phần tử lấy khỏi hàng đợi phần tử đưa vào mà phần tử lưu hàng đợi lâu Quy luật gọi vào trước trước (FIFO- First In First Out)  Những đạt được: -Tìm hiểu sở lý thuyết ngăn xếp hàng đợi - Biết ứng dụng ngăn xếp - Biết cách chuyển đổi biểu thức từ dạng trung tố sang hậu tố - Tính biểu thức theo phương pháp nghịch đảo BaLan -Viết chương trình ngăn xếp tính biểu thức nghịch đảo BaLan  Những chưa đạt - Chưa Demo chương trình viết - Ứng dụng khử đệ quy ngăn xếp chưa tìm hiểu kĩ Mục lục A.Ngăn xếp hàng đợi………………………………………2 I.Ngăn xếp……………………………………………………2 1.Khái niệm…………………………………………… 2.Tổ chức ngăn xếp mảng 3.Các phép toán……………………………………… a.Khởi tạo Stack………………………………… b.Các thao tác cho Stack………………… c.Chương trình Demo thao tác Stack……7 4.Tổ chức ngăn xếp danh sách liên kết…………….8 5.Các ứng dụng ngăn xếp………………………… 12 II.Hàng đợi(Queue) ……………………………………… 13 1.Khái niệm……………………………………………13 2.Tổ chức hàng đợi mảng……………………… 13 Các thao tác hàng đợi………………………….14 B Tính giá trị biểu thức theo phương pháp nghịch đảo Ba Lan …………………………………………………………………16 I Thuật toán chuyển biểu thức dạng trung tố sang hậu tố .17 II Thuật tốn tính giá trị biểu thức hậu tố …………… .19 III Chương trình Demo tính giá trị biểu thức nghịch đảo Ba Lan …………………………………………………………… .20 A.NGĂN XẾP VÀ HÀNG ĐỢI I.NGĂN XẾP(Stack) 1.Khái niệm: Ngăn xếp dạng danh sách đặc biệt thực hai thao tác: thêm phần tử vào cuối danh sách (push) lấy phần tử cuối khỏi danh sách (pop) a4 a3 a2 a1 Push pop Như ngăn xếp, phần tử vào sau lấy trước nên gọi danh sách kiểu LIFO (Last in first out).Vị trí phần tử phần tử cuối ngăn xếp gọi đỉnh(top)của ngăn xếp  Các thao tác ngăn xếp gồm hai thao thao tác là: • Push(x,S): Đưa phần tử x vào ngăn xếp • Pop(x,S): Lấy phần tử đỉnh ngăn xếp S lưu vào biến x Ngồi ra, cịn có thao tác bổ sung: • Init(S):Khởi tạo ngăn xếp S rỗng • Full(S): Cho biết ngăn xếp S có đầy khơng • Clear(S): Làm rỗng ngăn xếp S • Gettop(S): Lấy phần tử đỉnh ngăn xếp • Length(S): Cho biết số phần tử ngăn xếp 2) Tổ chức ngăn xếp mảng: Một ngăn xếp tổ chức mảng bao gồm hai thành phần: • Một mảng để lưu phần tử ngăn xếp • Vị trí đỉnh ngăn xếp Hình ảnh S=(a1,a2, chức sau: ngăn xếp ……,an) tổ mảng MaxLength Top … … a2  an a1 Khai báo liệu: Const MaxLength = ….; { Số phần tử tối đa ngăn xếp} Type ElementType = …; {Định nghĩa kiểu phần tử cho ngăn xếp} StackArr = Record Element : Array[1 MaxLength] of ElementType; Top : MaxLength; End; Var S: StackArr 3.Các phép toán: a.Khởi tạo stack: • Tạo stack S rỗng : Top = • Giá trị Top cho biết số phần tử hành có stack: Procedure Init(var S: StackArr); Begin S.top := 0; End; • Khi cài đặt mảng chiều, stack bị gia hạn kích thước nên cần xây dựng thêm thao tác phụ cho stack: Hàm Full kiểm tra đỉnh ngăn xếp, Top =MaxLength ngăn xếp đầy Function Full ( S: StackArr) : BooLean; Begin Full := (S.top = MaxLength); End; Hàm Empty kiểm tra đỉnh ngăn xếp, top=0 ngăn xếp rỗng Function Empty(S :StackArr): Boolean; Begin Empty := (S.top =0); End; b.Các thao tác cho Stack:  Thêm phần tử x vào đỉnh ngăn xếp S: Thêm phần tử A vào ngăn xếp Push (S,A) A Sau phần tử B Push (S,B) B A Sau phần tử C Push (S,C) C B A Procedure Push(x : ElementType; var S: StackArr); Begin If not Full(S) then With S Begin Inc(top); Element[top] := x; End;  Lấy phần tử cuối từ ngăn xếp S khỏi biến x: Lệnh Pop(S) lấy phần tử thêm vào khỏi Stack, phần tử C B A C Sau phần tử B C A Procedure Pop(var x: ElementType; var S : StackArr); Begin If not Empty(S) then With S B Begin x:= element[top]; dec(top); end; End;  Nhận xét: • Các thao tác làm việc với độ phức tạp 0(1) • Việc cài đặt Stack thông qua mảng chiều đơn giản hiệu • Tuy nhiên hạn chế lớn phương án cài đặt giới hạn kích thước Stack: Là ta cần phải biết trước kích thước tối đa ngăn xếp (giá trị max khai báo trên) Điều lúc xác định ta chọn giá trị dẫn đến lãng phí nhớ kích thước thừa so với yêu cầu thiếu dẫn tới chương trình khơng hoạt động b Chương trình Demo thao tác Stack Program stack_by_array; Const max =1000; Var Stack: Array[1 max] of integer; Top: integer; Procedure stack_init; Begin Top:=0; End; Procedure Push(v: integer); Begin If top= Max then writeln (“ngăn xếp đầy”) Else Begin Inc(top); Stack[top]:= v; End; End; Function Pop: integer; Begin If top=0 then writeln (“ ngăn xếp rỗng”) Else Begin Pop := stack[top]; Dec(top); End; End; BEGIN Stack_init; ; Tổ chức ngăn xếp danh sách liên kết: Để khắc phục nhược điểm tổ chức ngăn xếp mảng ta sử dụng danh sách liên kết để cài đặt ngăn xếp Để cài đặt ngăn xếp danh sách liên kết, ta sử dụng danh sách liên kết đơn Theo tính chất danh sách liên kết đơn, việc bổ sung loại bỏ phần tử khỏi danh sách thực đơn giản nhanh phần tử nằm đầu danh sách Do vậy, ta chọn cách lưu trữ ngăn xếp theo thứ tự: phần tử đầu danh sách đỉnh ngăn xếp, phần tử cuối danh sách đáy ngăn xếp Hình ảnh ngăn xếp S=(a1,a2,…,an) tổ chức danh sách liên kết sau: a1 a2 an Để bổ sung phần tử vào danh sách, ta tạo nút thêm vào đầu danh sách Để lấy phần tử khỏi ngăn xếp, ta cần lấy giá trị nút loại nút khỏi danh sách NIL Đỉnh ngăn xếp Đáy ngăn xếp  Khai báo Type StackLink = ^Cell; Cell = Record Data : ElementType; Link : StackLink; End; Var S : StackLink;  Các thao tác tổ chức ngăn xếp danh sách liên kết • Khởi tạo đỉnh ngăn xếp: Thao tác thực việc gán giá trị null cho nút đầu ngăn xếp, cho biết ngăn xếp trạng thái rỗng TOP NIL Procedure Init(Var S: StackLink); Begin S := Nil; End; Hàm Empty : Kiểm tra xem Stack có rỗng khơng Funtion Empty (S: StackLink): Boolean; Begin Empty := (S=Nil); End;  Thêm phần tử x vào đỉnh ngăn xếp S: S NIL P NIL Đỉnh ngăn xếp S NIL Đỉnh  Đoạn chương trình: Procedure Push (x : ElementType; var S: StackLink); Var p: StackLink; Begin New(p); p^.Data:=x; P^.Link:=S; S:=p; End; • Lấy phần tử khỏi stack: NIL Đỉnh Procedure Pop(Var x:ElmentType; var S: StackLink); Var p: StackLink; Begin If not Empty (S) then Begin x:= S^.Data; p:= S; S:= p^.Link; Dispose(p); End; End; • Làm rỗng ngăn xếp: xóa thu hồi nhớ Procedure Clear(var S: StackLink); Var p : StackLink; Begin While not Empty(S) Begin P:= S; S:= p^.Link; Dispose(p); End; End; Các ứng dụng ngăn xếp: • Khử đệ quy • Tính giá trị biểu thức  Nhận xét: Tổ chức ngăn xếp danh sách liên kết thích hợp lưu trữ loại liệu mà trình tự xuất ngược với trình tự lưu trữ II)Hàng đợi: (Queue) 1.Khái niệm: Hàng đợi kiểu liệu trừu tượng xây dựng mơ hình danh sách với hai thao tác bản: +Thêm phần tử vào cuối hàng đợi +Lấy phần tử đầu khỏi hàng đợi Hàng đợi thực theo nguyên tắc : phần tử đưa vào trước lấy trước nên gọi danh sách FIFO (Firt in Firt out) Hàng đợi Q= ( a1;a2;…;an) thể hình a1 a2 … an Lấy thêm vào 2.Tổ chức hàng đợi mảng: Hàng đợi tổ chức mảng giống hình danh sách cần hai thành phần để lưu vị trí phần tử lấy đầu hàng đợi (front) vị trí phần tử thêm vào cuối hàng đợi (rear) a1 Front a2 … an rear Khai báo liệu : Const Maxlength = ……;{số phần tử tối đa hàng đợi} Type ElementType=… ; {định nghĩa phần tử tối cho hàng đợi} Queue = Record Elemen:Array[1 Maxlength] of ElementType; Front , Rear:0 Maxlength; Var Q:Queue; 3.Các thao tác hàng đợi: • Khởi tạo hàng đợi: Procedure InitQueue(var Q:Queue); Begin Q.Front:=1; Q.Rear:=0; End; • Hàm Emply:(kiểm tra hàng đợi rỗng) Function Emply(Q:Queue):Boolean; Begin Emply := (Q.rear = 0); End; • Thêm vào phần tử: Thêm phần tử x vào hàng đợi Q Procedure themQueue(x:ElementType;var Q:Queue); Begin If not Full(Q) then Begin Q.rear := Q.rear +1; Q.element[Q.rear] : = x; End; End; • Lấy phần tử khỏi hàng đợi Q: Procedure RemoveQueue(var x:ElementType;var Q:Queue); Begin Ì not Emply(Q) then Begin X:=Q.elemeny[Q.front]; If Q.front = Q.rear then Begin Q.front ;==1;Q rear := );end Else Q.front := Q.front +1; End ; End ;  Nhận xét : Với cách tổ chức hàng đợi mảng thao tác gặp nhiều hạn chế B Tính giá trị biểu thức theo phương pháp nghịch đảo BaLan Khi thực chương trình, ngơn ngữ lập trình thường phải tính giá trị biểu thức Thơng thường, ngơn ngữ lập trình tính giá trị biểu thức cách : + Chuyển biểu thức từ dạng trung tố(infix) sang dạng hậu tố (posfix) + Tính giá trị biểu thức hậu tố Biểu thức trung tố cách người thường sử dụng, biểu thức trung tố phép tốn hai ngơi viết hai tốn hạng Việc tính trực tiếp biểu thức trung tố gặp khó khăn phải dùng cặp dấu ngoặc đơn để quy định thứ tự thực biểu thức Để tính biểu thức, người BaLan đưa ký pháp quy định cách viết biểu thức( gọi kí pháp BaLan) phép toán đặt sau toán hạng Việc dùng kí pháp BaLan khơng cần dấu ngoặc thể thứ tự ưu tiên tính giá trị biểu thức nên dễ dàng xây dựng thuật tốn tính Ví dụ : Biểu thức dạng trung tố : 3+(5-2)*3/7-4 Chuyển sang dạng hậu tố : -3* 7/4 - + Thuật toán chuyển biểu thức dạng trung tố sang dạng hậu tố : Giả sử ta có biểu thức E dạng trung tố ta phân tích thành thành phần biểu thức toán hạng phép toán Dùng ngăn xếp S phần tử phép toán dấu ngoặc mở Kết đưa biểu thức hậu tố E1 I.Thuật toán chuyển biểu thức dạng trung tố sang hậu tố Khởi tạo biểu thức E1, rỗng Duyệt từ trái sang phải thành phần cảu biểu thức E1, với thành phần x thực : 2.1 Nếu x toán hạng nối vào bên phải biểu thức E1 2.2 Nếu x dấu ngoặc mở đưa vào ngăn xếp 2.3 Nếu x phép tốn : a Đọc phần tử y đầu ngăn xếp b Nếu độ ưu tiên y cao x - Lấy y khỏi ngăn xếp - Nối y vào bên phải E1 - Lặp lại bước a c Nếu độ ưu tiên x cao y đưa x vào ngăn xếp d Nếu ngăn xếp rỗng đưa x vào ngăn xếp 2.4 Nếu x dấu ngoặc đóng : a Đọc phần tử y đầu ngăn xếp b Nếu y phép tốn : - Lấy y khỏi ngăn xếp - Nối y vào bên phải biểu thức E1 - (2Lặp lại bước a c Nếu y dấu ngoặc mở lấy khỏi ngăn xếp Lặp lại bước hết biểu thức E Lấy phần tử ngăn xếp nối vào bên phải biểu thức E1 ngăn xếp rỗng Ví dụ : Với biểu thức E=(2+7*3-8)*4-(3+2)*3-2, thuật toán chuyển thành biểu thức hậu tố thực bước thể qua kết bảng sau : Thành phần biểu thức E ( Ngăn xếp ( ᴓ Biểu thức E1 ( +2 (+ (+ 27 * (+* 27 (+* 273 - (- 3*+ (- 3*+ ) ᴓ *+8- * * 3*+ 8- * 3*+ 8-4 - - 3*+ 8-4* ( -( 3*+ 8-4* -( 3*+ 8-4*3 + -(+ 3*+ 8-4*3 -(+ 3*+ 8-4*3 ) - 3*+ 8-4*3 2+ * -* 3*+ 8-4*3 2+ -* 3*+ 8-4*3 2+3 - - 3*+ 8-4*3 2+3*- - 3*+ 8-4*3 2+3*-2 ᴓ 3*+ 8-4*3 2+3*-2- II.Thuật tốn tính giá trị biểu thức hậu tố Cho biểu thức viết dạng hậu tố E1 Để tính giá trị biểu thức ta dùng ngăn xếp S lưu toán hạng kết tính tốn trung gian Thuật tốn Duyệt cac phần tử biểu thức E1, với thành phần x thực : a Nếu x tốn hạng đưa vào ngăn xếp b Nếu x phép tốn lấy hai phần tử đầu ngăn thực tính theo phép tốn đưa kết vào ngăn xếp Lặp lại bước hết biểu thức Giá trị lại ngăn xếp kết biểu thức E1 Ví dụ : Kết tính biểu thức hậu tố E1= 3*+8-4*3 2+3*-2- qua bước biểu diễn bảng sau : Thành phần biểu thức E1 *2 Ngăn xếp 27 273 * 21 + 23 23 - 15 15 * 60 60 60 + 60 60 * 60 15 - 45 45 - 43 III Chương trình demo tính giá trị biểu thức nghịch đảo BaLan program tinhgiatribieuthuc; const Opt = ['+', '-', '*', '/']; var T, RPN: String; Stack: array[1 255] of Extended; p, Last: Integer; procedure StackInit; begin Last := 0; end; procedure Push(V: Extended); begin Inc(Last); Stack[Last] := V; end; function Pop: Extended; begin Pop := Stack[Last]; Dec(Last); end; procedure Refine(var S: String); {Hiệu chỉnh biểu thức RPN khuôn dạng dễ đọc nhất} var i: Integer; begin S := S + ' '; for i := Length(S) - downto {Thêm dấu cách toán hạng toán tử} if (S[i] in Opt) or (S[i + 1] in Opt) then Insert(' ', S, i + 1); for i := Length(S) - downto {Xoá dấu cách thừa} if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1); end; procedure Process(T: String); {Xử lý phần tử T đọc từ biểu thức RPN} var x, y: Extended; e: Integer; begin if not (T[1] in Opt) then {T toán hạng} begin Val(T, x, e); Push(x); {Đổi T thành số đẩy giá trị vào Stack} end else {T toán tử} begin y := Pop; x := Pop; {Ra hai} case T[1] of '+': x := x + y; '-': x := x - y; '*': x := x * y; '/': x := x / y; end; Push(x); {Vào một} end; end; begin Write('Enter RPN Expression: '); ReadLn(RPN); Refine(RPN); StackInit; T := ''; for p := to Length(RPN) {Xét ký tự biểu thức RPN từ trái qua phải} if RPN[p] ' ' then T := T + RPN[p] {nếu dấu cách nối vào sau xâu T} else {Nếu gặp dấu cách} begin Process(T); {Xử lý phần tử vừa đọc xong} T := ''; {Đặt lại T để chuẩn bị đọc phần tử mới} end; WriteLn(RPN, ' = ', Pop:0:4); {In giá trị biểu thức RPN lưu Stack} end DANH SÁCH NHÓM TRẦN THỊ MY LY NGUYỄN HOÀI THƯƠNG TRẦN THỊ VY NGUYỄN THỊ NHƯ Ý ... thuyết ngăn xếp hàng đợi - Biết ứng dụng ngăn xếp - Biết cách chuyển đổi biểu thức từ dạng trung tố sang hậu tố - Tính biểu thức theo phương pháp nghịch đảo BaLan -Viết chương trình ngăn xếp tính biểu. .. tổ chức hàng đợi mảng thao tác gặp nhiều hạn chế B Tính giá trị biểu thức theo phương pháp nghịch đảo BaLan Khi thực chương trình, ngơn ngữ lập trình thường phải tính giá trị biểu thức Thơng thường,... trình tính giá trị biểu thức cách : + Chuyển biểu thức từ dạng trung tố(infix) sang dạng hậu tố (posfix) + Tính giá trị biểu thức hậu tố Biểu thức trung tố cách người thường sử dụng, biểu thức

Ngày đăng: 18/06/2015, 21:40

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan