WM cấu trúc dữ liệu va giải thuật đỗ bích diệp ch4 stack va queue sinhvienzone com

29 78 0
WM cấu trúc dữ liệu va giải thuật đỗ bích diệp ch4 stack va queue sinhvienzone com

Đ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

Cấu trúc liệu Giải thuật om Cấu trúc liệu Giải thuật Vi en Zo ne C Chương III: Stack Queue nh Danh sách kiểu ngăn xếp - Stack Si – Stack z z Một kiểu danh sách tuyến tính đặc biệt Phép bổ sung phép loại bỏ tuân thủ theo chế “vào sau trước” (last in first out) , thực đầu đỉnh đỉnh đáy Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Danh sách kiểu ngăn xếp - Stack Hai thao tác danh sách kiểu ngăn xếp z – push(Element e) : bổ sung phần tử vào Stack Element pop(): Loại bỏ trả giá trị phần tử đỉnh Stack om z Các thao tác khác z z Vi en Zo ne z Int size(): Trả số phần tử Stack Boolean isEmpty(): Kiểm tra xem Stack có rỗng không Element top(): Trả giá trị phần tử đỉnh Stack C – Si nh Các thao tác Stack Push Đẩy phần tử vào stack Data Top Top Stack Stack Overflow Data Top Trường hợp Stack đầy Stack Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Các thao tác Stack Pop Lấy phần tử đỉnh stack Data Top Top Underflow C Trường hợp Stack cạn om Stack Stack Stack Vi en Zo ne Top Si nh Danh sách kiểu ngăn xếp Thao tác create() push(5) push(3) pop() push(7) top() pop() pop() isEmpty() push(9) push(8) push(7) size() Output 7 true Stack [] [5] [5,3] [5] [5,7] [5,7] [5] [] [] [9] [9,8] [9,8,7] [9,8,7] Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Ứng dụng Stack – Vi en Zo ne C – Lưu trữ trang web duyệt Web browser Cài đặt thao tác Undo phần mềm soạn thảo Lưu danh sách lời gọi hàm Java Virtual Machine om – Si nh Lưu trữ Stack z z Stack lưu trữ vector lưu trữ S, gồm n ô nhớ Đỉnh stack xác định số T – T cập nhật có thao tác bổ sung hay loại bỏ thực stack … S t Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com N https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ Stack z Giải thuật bổ sung phần tử vào Stack lưu trữ Procedure PUSH(S,T,X) Begin if T >= n then begin write(‘STACK TRÀN’); C return; end; Vi en Zo End ne T:= T+1; S[T] := X; om {S: vector lưu trữ có n nhớ; T: số phần tử đỉnh stack thời; X giá trị cần thêm vào } nh Lưu trữ Stack Si z Giải thuật lấy phần tử đỉnh Stack lưu trữ Procedure POP(S,T, Y) Begin {S: stack xét ; T: số phẩn tử đỉnh stack thời; Phần tử lấy bảo lưu sử dụng biến Y } if T = then begin write(‘STACK CẠN’); return; end; Y:= S[T]; S[T] := null; T:= T-1; End Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Hiệu Hạn chế Hiệu – – z n số phần tử stack Không gian lưu trữ : O(n) Các thao tác có độ phức tạp O(1) om – Hạn chế – Vi en Zo ne – Kích thước tối đa phải xác định trước không thay đổi Xảy tràn stack C z nh Lưu trữ móc nối Stack Si – Cách tiếp cận z z z Đỉnh Stack coi phần tử nằm đầu danh sách pop() : Lấy phần tử danh sách móc nối push(o) : Bổ sung phần tử vào đầu danh sách móc nối L Đỉnh Stack Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Stack • Cách tiếp cận •Phần tử cuối coi đỉnh stack •pop() : Lấy phần tử cuối danh sách móc nối •push(o): Bổ sung phần tử vào cuối danh sách móc nối om L lưu trữ móc nối phù hợp cấu trúc liệu Stack? Vi en Zo ne zCách C Đỉnh Stack nh Lưu trữ móc nối Stack Si – Khai báo Stack móc nối C struct stacknode { int item; struct stacknode *next; }; typedef struct stacknode STACKNODE; typedef STACKNODE * STACKNODEPTR; STACKNODEPTR top = NULL; Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Stack – Bổ sung vào Stack int push ( STACKNODEPTR *top , int value ) { STACKNODEPTR newnode; newnode = malloc sizeof (STACKNODE); om if (nut == null) { printf(“\n No memory”); return 1; } else { newnode->item = value; C newnode ->next = *top; *top = newnode; ne return 0; } Vi en Zo } nh Lưu trữ móc nối Stack Si – Loại bỏ nút int pop ( STACKNODEPTR *top) { int item; STACKNODEPTR temp; temp = *top; item = (*top)->item; *top = (*top)->next; free (temp); return item; } Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Danh sách kiểu hàng đợi - Queue lối trước Queue z lối sau Vi en Zo ne C z Queue (Hàng đợi) kiểu danh sách tuyến tính đặc biệt Phép bổ sung loại bỏ hoạt động theo chế “vào trước trước” (first in first out) ; bổ sung đầu loại bỏ đầu om z nh Danh sách kiểu hàng đợi - Queue Si – – Hai hàm danh sách kiểu hàng đợi z z enqueue(Element e) Element dequeue() Các hàm khác z z z z create(): size() : isEmpty(): Element front() Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Danh sách kiểu hàng đợi – Queue Thao tác Output Queue create() - [] enqueue(5) - [5] enqueue(3) - [5,3] dequeue() [3] dequeue() isEmpty() true enqueue(9) - enqueue(8) - [3,7] [7] [] ne dequeue() [3,7] om - front() C enqueue(7) enqueue(7) [9] [9,8] - [9,8,7] [9,8,7] Vi en Zo size() [] nh Ứng dụng Queue Si – – Hàng đợi phòng bán vé Truy nhập vào thiết bị dùng chung văn phòng (ví dụ máy in) Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 10 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Queue – Cách tiếp cận 1: Sử dụng danh sách nối đơn z z z Lối trước Queue đầu danh sách enqueue(o): bổ sung phần tử vào cuối danh sách dequeue() : loại bỏ phần tử đầu danh sách R om F L C Lối sau Queue Lối trước Queue ne Luôn nắm giữ hai trỏ F trỏ tới phần tử lối trước queue, R trỏ tới phần tử lối sau queue Vi en Zo z nh Lưu trữ móc nối Queue Si – Cách tiếp cận 2: z z z Lối sau Queue đầu danh sách enqueue(o): bổ sung phần tử vào đầu danh sách dequeue() : loại bỏ phần tử cuối danh sách R F L Lối sau Queue Lối trước Queue Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 15 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Queue z Giải thuật bổ sung phần tử vào Queue lưu trữ danh sách móc nối – Bổ sung vào cuối danh sách Procedure ENQUEUE(F,R,X) {Khởi tạo nút mới} Call New(p); INFO(p) := X; LINK(p) := Null; om Begin {Danh sách cho rỗng} if F = Null then F:= R:= p; C else LINK(R) := p; R:= p; Vi en Zo ne End nh Lưu trữ móc nối Queue Si z Giải thuật loại bỏ phần tử khỏi Queue – Loại bỏ phần tử danh sách Procedure DEQUEUE(F,R, Y) Begin { Y biến lưu trữ phần tử lấy } p:= F; Y:= INFO(p); {Danh sách ban đầu có phần tử} if (F = R) and (F Null) then F:= R:= Null; else F:= LINK(p); Call Dispose(p) ; End Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 16 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Hàng đợi hai đầu - DEQueue DeQueue – Các hàm sở hàng đợi hai đầu D – – – z insertFirst(o) insertLast(o) : removeFirst() removeLast() om – Các hàm khác – – – – Vi en Zo – first() last() size() isEmpty() create() C z Hàng đợi hai đầu cấu trúc liệu dạng hàng đợi hỗ trợ phép bổ sung loại bỏ đầu cuối ne z nh Hàng đợi hai đầu - DeQueue Si Thao tác create() insertFirst(5) insertFirst(3) removeFirst() insertLast(7) removeFirst() removeLast() removeLast() isEmpty() insertLast(9) insertFirst(8) insertLast(7) size() Output 3 error true DeQueue [] [5] [3,5] [5] [5,7] [7] [] [] [] [9] [8,9] [8,9,7] [8,9,7] Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 17 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối với DeQueue DeQueue lưu trữ sử dụng cấu trúc danh sách móc nối kép (Doubly Linked – List) – – Mỗi nút danh sách ngồi trường INFO chứa liệu có trường trỏ z PREV z NEXT Cần nắm hai trỏ, trỏ L trỏ tới nút cực trái, trỏ R trỏ tới nút cực phải danh sách Với danh sách rỗng , L = R = NULL om – B C G H R Vi en Zo ne L C z nh Lưu trữ móc nối DeQueue Si z z Giải thuật bổ sung phần tử vào đầu DeQueue lưu trữ danh sách nối kép Giải thuật loại bỏ phần tử đầu DeQueue lưu trữ danh sách nối kép Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 18 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Bài toán đổi số số Bài toán: Viết số hệ thập phân thành số hệ số b z Ví dụ: – – Vi en Zo ne C – (356)10 = (101100100)2 (356)10 = (544)8 (356)10 = (164)16 om – nh Bài toán đổi số sử dụng Stack Si z Ví dụ: – (356)10 = (101100100)2 356 178 89 44 22 11 2 2 Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 19 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Bài toán đổi số sử dụng Stack – Thuật toán: z z z Đầu vào: Số n hệ thập phân Đầu ra: Số tương ứng với n hệ đếm số b Thực Vi en Zo ne C om Lấy chữ số tạo n%b Đẩy vào Stack Thay n n/b để tiếp tục lấy chữ số kết Lặp lại bước kết phép chia Lần lượt lấy chữ số khỏi Stack in chúng kết Si nh Bài toán đổi số sử dụng Stack n= 356 Empty stack n%16 = n = n/16 = 22 n%16 = n = n/16 = 1 n%16 = n = n/16 = Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 20 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Bài toán đổi số sử dụng Stack Procedure CONVERT(n, b) Begin m = N; { Tính số dư nạp vào stack S} om while m begin R := m mod b; call PUSH(S, T, R); m := m div b; {thay m thương phép chia m cho b} C end; {Hiện thị chữ số nhị phân mã số biểu diễn N} while T begin call POP(S,T,X); {lấy số khỏi stack} write(X); ne end Vi en Zo End nh Bài toán kiểm tra cặp ngoặc Si – – Kiểm tra cặp ngoặc Mỗi dấu “(”, “{”, or “[” phải có dấu đóng tương ứng “)”, “}”, or “[” z Đúng: ( )(( )){([( )])} z Đúng : ((( )(( )){([( )])} z Sai: )(( )){([( )])} z Sai: ({[ ])} z Sai: ( Viết giải thuật nhận xâu đầu vào gồm ký tự mở , đóng ngoặc Kiểm tra xâu có hợp lệ khơng Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 21 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Vi en Zo ne C om Function ParenMatch(X,n): { X xâu bao gồm n ký tự mở, đóng ngoặc Giải thuật trả giá trị true xâu X chứa số hợp lệ cặp ngoặc , không trả giá trị false} Khởi tạo S stack rỗng for i = to n begin if X[i] ngoặc mở then S.push(X[i]) else if X[i] ngoặc đóng then begin if S.isEmpty() then return false {khơng có ngoặc mở tương ứng} if S.pop() không hợp kiểu với X[i] then return false {cặp ngoặc đóng mở khác kiểu} end end if S.isEmpty() then return true { tất cặp ngoặc hợp lệ} else return false {vẫn tồn số ngoặc mở mà khơng tìm thấy ngoặc đóng tương ứng} nh Biểu thức số học với ký pháp Balan Si z Thông thường, biểu thức số học biểu diễn theo ký pháp trung tố (infix notation) – – – Dấu phép toán (toán tử) nằm toán hạng z A+B*C Thứ tự thực phép toán xác định sử dụng cặp dấu ngoặc quy định thứ tự ưu tiên phép toán z Biểu thức A* B^2 – C/D + E thực theo thứ tự sau B^2 Ỉ A*(B^2)ỈC/DỈ (A*(B^2)) –(C/D)Ỉ ((A*(B^2)) – (C/D)) + E Tính tốn giá trị biểu thức phức tạp Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 22 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Biểu thức số học với ký pháp Balan – Trong ký pháp dạng tiền tố: Tốn tử ln đặt trước tốn hạng Tốn tử – om z Có thể biểu diễn biểu thức mà không dùng đến dấu ngoặc sử dụng ký pháp tiền tố (prefix notation) ký pháp hậu tố (postfix notation) Biểu thức dạng tiền tố hậu tố Toán hạng Toán hạng Trong ký pháp dạng hậu tố: Tốn tử ln đặt sau tốn hạng Toán hạng Toán tử Vi en Zo ne Toán hạng C z Si nh Biểu thức số học với ký pháp Balan Dạng trung tố Dạng tiền tố Dạng hậu tố A+B +AB AB+ (A+B) * C *+ABC AB+C* A + B* C +A*BC ABC*+ (A + B ) / (C-D) /+AB–CD AB+CD-/ A+B/C–D -+A/BCD A B C/ + D - Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 23 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Bài tốn tính giá trị biểu thức dạng hậu tố Tính giá trị biểu thức dạng hậu tố sử dụng Stack – Các bước giải thuật – – – Vi en Zo ne – Đọc biểu thức dạng hậu tố từ trái qua phải Nếu ký tự đọc tốn hạng lưu giá trị vào stack Nếu ký tự đọc tốn tử X lấy từ stack giá trị, thực phép tốn X với giá trị đó, nạp kết vào stack Thực bước đến toàn biểu thức đọc om z Đầu vào : Xâu ký tự biểu diễn biểu thức dạng hậu tố z A B + C – D E * / z Các giá trị biến số C z nh Bài tốn tính giá trị biểu thức dạng hậu tố Procedure EVALUATE (P, VAL) Si Begin { P biểu thức dạng hậu tố cần tính, VAL biến lưu giá trị tính } Ghi thêm dấu ‘ )’ vào cuối P để đánh dấu điểm kết thúc repeat Đọc ký tự X P (lần lượt từ trái sang phải) ; if X toán hạng then call PUSH(S, T, X) ; else begin call POP(S, T, Y) ; call POP(S, T, Z); Thực phép toán với hai toán hạng Z,Y kết W; call PUSH (S, T, W) ; end; until Gặp dấu kết thúc xâu ‘)’ ; call POP (S,T, VAL); End Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 24 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Bài tốn tính giá trị biểu thức dạng hậu tố Ký tự đọc A z Ví dụ: A B + C – D E * / với A = 5, B = 14, C = 1, D = 2, E = B + 5+14 C 19-1 D E * 2*3 / 18/6 C om Stack 2 18 18 18 14 19 19 18 VAL Vi en Zo ne nh Chuyển biểu thức dạng trung tố sang dạng hậu tố Si – – Bài toán z z Xét biểu thức số học dạng trung tố gồm phép toán cộng, trừ, nhân, chia, lũy thừa dấu ngoặc Viết biểu thức dạng hậu tố tương ứng với biểu thức trung tố đầu vào Để thực hiện, biểu thức trung tố cần biết z z Thứ tự ưu tiên phép toán : Lũy thừa Ỉ Nhân, Chia Ỉ Cộng, Trừ Qui tắc kết hợp: Nếu có hai phép tốn thứ tự ưu tiên – – z Lũy thừa: Phải trước, trái sau 2^3^4 = 2^(3^4) Các phép toán khác : Trái trước, phải sau Dầu ngoặc : Ưu tiên Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 25 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Chuyển biểu thức dạng trung tố sang dạng hậu tố – Thực z Duyệt biểu thức trung tố từ trái sang phải – – om Cần xác định trường hợp để đưa phép tốn cho xác Vi en Zo ne C z Gặp tốn hạng Ỉ Đưa Gặp phép tốn Ỉ Cần đợi tốn hạng số Ỉ Phải lưu lại z Sử dụng Stack để lưu trữ nh Chuyển biểu thức dạng trung tố sang dạng hậu tố Si z Tình huống: – – – z Có phép tốn lưu trữ Stack Khi duyệt biểu thức dạng trung tố, gặp phải phép toán khác Xác định trường hợp để đưa phép tốn từ Stack cho xác với biểu thức dạng hậu tố Giải pháp: So sánh phép toán xét với phép toán lưu đỉnh Stack thứ tự ưu tiên , qui tắc kết hợp Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 26 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Chuyển biểu thức dạng trung tố sang dạng hậu tố Qui tắc đưa phép toán khỏi Stack: z Qui tắc bản: Nếu phép toán xét có thứ tự ưu tiên thấp phép tốn đỉnh Stack Ỉ Đưa phép tốn đỉnh Stack om – * ne 1*2 + Đã đưa Đang xét + Đưa * Vi en Zo 1+2 * Đã đưa Đang xét * Không đưa + C + nh Chuyển biểu thức dạng trung tố sang dạng hậu tố Si – Qui tắc có hai phép tốn mức ưu tiên z Nếu phép tốn có tính chất kết hợp trái (cộng, trừ , nhân, chia ) đưa phép toán đỉnh ngăn xếp z 1–2+3 Đang xét + Đưa – Hậu tố tương ứng – + Nếu phép tốn có tính chất kết hợp phải (lũy thừa) khơng đưa phép toán đỉnh ngăn xếp ^ 2^3 ^4 Đang xét ^ thứ Không đưa ^ đỉnh Stack Hậu tố tương ứng ^ ^ Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 27 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật Chuyển biểu thức dạng trung tố sang dạng hậu tố Trường hợp hàng loạt phép toán dời ngăn xếp * + Dấu ngoặc: z z Vi en Zo z Khi đọc mở ngoặc, đẩy vào Stack , không đưa phép toán Khi dấu mở ngoặc Stack khơng đưa xét phép tốn Khi đọc đóng ngoặc, đưa tất phép toán Stack gặp dầu mở ngoặc Các dấu ngoặc không đưa vào biểu thức hậu tố C z ne – 1+2*3–4 Đang xét – Phải đưa * + Hậu tố * + - om – nh Chuyển biểu thức dạng trung tố sang dạng hậu tố Si – Các bước giải thuật Duyệt biểu thức trung tố từ trái sang phải Gặp toán hạng đưa Gặp dấu ( Ỉ Đưa vào ngăn xếp Gặp dấu ) Ỉ đưa phần tử khỏi ngăn xếp gặp dấu ( , dấu ( lấy khỏi ngăn xếp Nếu gặp dấu phép toán : so sánh độ ưu tiên phép toán xét phép toán đỉnh stack z Nếu phép tốn xét có độ ưu tiên lớn phép toán đỉnh stack phép tốn xét có độ ưu tiên phép tốn đỉnh phép tốn ^, đẩy phép toán xét vào đỉnh stack z Nếu khơng, đưa phép tốn đỉnh stack thấy phép toán đỉnh stack có độ ưu tiên thấp phép tốn xét z Đẩy phép toán xét vào đỉnh stack Kết thúc biểu thức Ỉ Đưa nốt phép tóan ngăn xếp Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 28 https://fb.com/sinhvienzonevn Cấu trúc liệu Giải thuật - + + - ( ( ( B + / D * E / / C - D * * / E * Si nh Vi en Zo A C) om B C ( + ne (A Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com 29 https://fb.com/sinhvienzonevn ... R F L Lối sau Queue Lối trước Queue Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone. com 15 https://fb .com/ sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Queue z Giải thuật bổ sung... typedef STACKNODE * STACKNODEPTR; STACKNODEPTR top = NULL; Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone. com https://fb .com/ sinhvienzonevn Cấu trúc liệu Giải thuật Lưu trữ móc nối Stack –... thao tác Queue Si Data A front D Enqueue B rear Queue A front B Queue Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone. com D rear 12 https://fb .com/ sinhvienzonevn Cấu trúc liệu Giải thuật Các

Ngày đăng: 30/01/2020, 21:08

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan