1. Trang chủ
  2. » Giáo án - Bài giảng

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

29 95 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 467,2 KB

Nội dung

Cấu trúc liệu Giải thuật Cấu trúc liệu Giải thuật Chương III: Stack Queue Danh sách kiểu ngăn xếp - Stack – 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 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 Các thao tác khác z z 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á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 Stack Stack Underflow Trường hợp Stack cạn Top Stack 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 – – – 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 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 {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 } if T >= n then begin write(‘STACK TRÀN’); return; end; T:= T+1; S[T] := X; End Lưu trữ Stack 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ế z 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) Hạn chế – – Kích thước tối đa phải xác định trước không thay đổi Xảy tràn stack Lưu trữ móc nối Stack – 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 L Đỉnh Stack zCách lưu trữ móc nối phù hợp cấu trúc liệu Stack? Lưu trữ móc nối Stack – 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); if (nut == null) { printf(“\n No memory”); return 1; } else { newnode->item = value; newnode ->next = *top; *top = newnode; return 0; } } Lưu trữ móc nối Stack – 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 z lối trước Queue z 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 lối sau Danh sách kiểu hàng đợi - Queue – 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] enqueue(7) - [3,7] front() [3,7] dequeue() [7] dequeue() [] isEmpty() true [] enqueue(9) - [9] enqueue(8) - [9,8] enqueue(7) - [9,8,7] size() [9,8,7] Ứng dụng Queue – – 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 F R L Lối trước Queue z Lối sau Queue 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 Lưu trữ móc nối Queue – 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) Begin {Khởi tạo nút mới} Call New(p); INFO(p) := X; LINK(p) := Null; {Danh sách cho rỗng} if F = Null then F:= R:= p; else LINK(R) := p; R:= p; End Lưu trữ móc nối Queue 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 z DeQueue – z Các hàm sở hàng đợi hai đầu D – – – – 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 insertFirst(o) insertLast(o) : removeFirst() removeLast() Các hàm khác – – – – – first() last() size() isEmpty() create() Hàng đợi hai đầu - DeQueue 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 z 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 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 B L C G H R Lưu trữ móc nối DeQueue 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ụ: – – – (356)10 = (101100100)2 (356)10 = (544)8 (356)10 = (164)16 Bài tốn đổi số sử dụng Stack 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 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 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} 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} 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); end End Bài toán kiểm tra cặp ngoặc – 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 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} Biểu thức số học với ký pháp Balan 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 z 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ố – Trong ký pháp dạng tiền tố: Tốn tử ln đặt trước toán hạng Toán tử – Toán hạng Toán hạng Trong ký pháp dạng hậu tố: Toán tử ln đặt sau tốn hạng Tốn hạng Toán tử Toán hạng 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ố z Tính giá trị biểu thức dạng hậu tố sử dụng Stack – 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ác bước giải thuật – – – – Đọ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 toá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 Bài tốn tính giá trị biểu thức dạng hậu tố Procedure EVALUATE (P, VAL) 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 Stack 14 5 19 19 18 2 18 18 18 VAL Chuyển biểu thức dạng trung tố sang dạng hậu tố – 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 tố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 – – z Gặp toá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ữ Cần xác định trường hợp để đưa phép tốn cho xác Chuyển biểu thức dạng trung tố sang dạng hậu tố 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 toá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 tốn xét có thứ tự ưu tiên thấp phép tốn đỉnh Stack Ỉ Đưa phép toán đỉnh Stack + * 1+2 * Đã đưa Đang xét * Không đưa + 1*2 + Đã đưa Đang xét + Đưa * Chuyển biểu thức dạng trung tố sang dạng hậu tố – 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 tố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 tố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 * + – 1+2*3–4 Đang xét – Phải đưa * + Hậu tố * + - Dấu ngoặc: z z z z Khi đọc mở ngoặc, đẩy vào Stack , khơng đưa phép tố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ố Chuyển biểu thức dạng trung tố sang dạng hậu tố – 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 tốn xét vào đỉnh stack z Nếu khơng, đưa phép toán đỉnh stack thấy phép tốn đỉnh stack có độ ưu tiên thấp phép toá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 (A ( A + B - + + - ( ( ( B + C) C - / D * E / / * * / E D Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội SinhVienZone.com * 29 https://fb.com/sinhvienzonevn ... 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. .. 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 Data D Enqueue A front 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

TÀI LIỆU LIÊN QUAN