1. Trang chủ
  2. » Tất cả

Ngăn xếp và hàng đợi

21 7 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 21
Dung lượng 1,21 MB

Nội dung

C CuuDuongThanCong com https //fb com/tailieudientucntt cu u d uo ng th an co ng c om http //cuuduongthancong com?src=pdf https //fb com/tailieudientucntt  Ngăn xếp là một kiểu danh sách được trang b[.]

.c om ng co an th ng du o u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Ngăn xếp kiểu danh sách trang bị hai phép toán: ng   bổ sung phần tử vào cuối danh ng th an co sách  loại bỏ phần tử cuối danh sách cu u du o Có thể hình dung ngăn xếp hình ảnh chồng đĩa, đĩa đặt vào chồng sau nằm tất đĩa khác lấy  Vì nguyên tắc “vào sau trước” đó, Stack cịn có tên gọi danh sách kiểu LIFO (Last In First Out)  Vị trí cuối danh sách gọi đỉnh (top) Stack  CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Khi mô tả Stack mảng: co ng  Bổ sung phần tử vào Stack ~ thêm phần u du o ng th an tử vào cuối mảng  Loại bỏ phần tử khỏi Stack ~ loại bỏ phần tử cuối mảng  Stack bị tràn bổ sung vào mảng đầy  Stack rỗng số phần tử thực chứa mảng = cu  CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om ng #define max = 10000 int Stack[max]; int Top; co void StackInit() { Top = 0; } cu u du o ng th an int Pop() { if (Top == 0) { printf(“Stack is empty”); void Push(int V) { return -1; if (Top >= max-1) } printf(“Stack is full”); else { else { int res = Stack[Top]; Top++; Top ; Stack[Top] = V; return res; } } } } Độ phức tạp tính toán thao tác Init, Push, Pop đểu Θ(1) CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om cu u du o ng CuuDuongThanCong.com int Pop() { if (Top == NULL) { print('Stack is empty'); return -1; } else { int res = Top->data; TNode * P = Top->next; free(Top); Top = P; return res; } } co th typedef struct node { int data; TNode *next; } TNode; TNode * Top; void StackInit() { Top = NULL; } void Push(int V) { TNode * P = (TNode *) malloc(sizeof(TNode)); P->data = V; P->next = Top; Top = P; } ng Khi cài đặt Stack danh sách nối đơn kiểu LIFO, ta bỏ qua việc kiểm tra Stack tràn an  https://fb.com/tailieudientucntt .c om ng  Đổi số nguyên từ hệ thập phân sang hệ nhị phân Ví dụ 2310 = 101112 Thuật toán co  th an Input số n Nếu n=0 nhảy đến bước 4, khơng thực u Tuy nhiên với thuật tốn thứ tự chữ số hệ nhị phân bị ngược Thật vậy: cu  du o ng bước 3 In số dư n chia cho (d = n%2) gán n = n/2 Kết thúc CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Ví dụ đổi số n = 23 sang hệ nhị phân, theo thuật toán trên: ng  u Mà thực tế 2310 = 101112 Để giải tình trạng thứ tự ngược, ta lợi dụng tính chất vào sau, trước ngăn xếp cu   du o ng th an co n=23 ≠ 0, in 23 % = 1, gán n = 23/2 =11 n=11 ≠ 0, in 11 % = 1, gán n = 11/2 = n=5 ≠ 0, in % = 1, gán n = 5/2 = n=2 ≠ 0, in % = 0, gán n = 2/2 = n=1 ≠ 0, in % = 1, gán n = 1/2 = n=0, thuật toán kết thúc, ta thu dãy chữ số 11101 CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om  Hàm in số n dạng nhị phân cu u du o ng th an co ng void outputInBinary(int n) { while (n > 0) { int bit = n % 2; push(bit); // đẩy vào stack n = n / 2; } while { printf(“%d”,pop()); // lấy khỏi stack } CuuDuongThanCong.com https://fb.com/tailieudientucntt   c om ng ng cu u du o  th an  Có thể dùng chế stack để khử đệ quy cho tất hàm đệ quy Bài toán tháp Hà Nội: cọc số cọc có mơ hình stack Stack dùng để phân tích tính giá trị biểu thức đại số, vi dụ: (2 * - * 2) / (11 9) (kết quả: 4), đổi ký pháp trung tố thành hậu tố (kết quả: * * - 11 - /) Bài tốn tìm kiếm theo chiều sâu đồ thị co  CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om ng co an th u du o ng Một đoàn tàu chứa n toa tàu đánh số từ đến n nằm đường ray A Do nhu cầu vận chuyển, người ta muốn xếp lại toa tàu theo thứ tự chuyển đồn tàu với thứ tự toa qua đường ray C Thứ tự hoán vị (1, 2, …, n) Quy tắc chuyển sau: đưa toa tàu chạy theo đường ray theo hướng mũi tên, dùng đoạn đường ray B (dường tránh) để chứa tạm toa tàu trình di chuyển 10 cu  CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om ng co an th Bài toán đặt nhập vào thứ tự cần có toa tàu, cho biết có phương án chuyển hay khơng, có đưa cách chuyển  Ví dụ: n = 4; Thứ tự cần có (1, 4, 3, 2) 1)A→C; 2)A→B; 3)A→B; 4)A→C; 5)B→C; 6)B→C  Hoặc tổng quát hơn:liệt kê tất hoán vị thứ tự toa tạo thành đoạn đường ray C với luật di chuyển cu u du o ng  CuuDuongThanCong.com https://fb.com/tailieudientucntt 11 .c om Hàng đợi kiểu danh sách trang bị hai phép toán: co ng   bổ sung phần tử vào cuối Loại bỏ Đầu Cuối Có thể hình dung hàng đợi đoàn người xếp hàng mua vé: Người xếp hàng trước mua vé trước khỏi hàng để nhường vị trí cho người xếp hàng phía sau Vì ngun tắc “vào trước trước” đó, Queue cịn có tên gọi danh sách kiểu FIFO (First In First Out) cu u  du o ng th an danh sách (Rear)  loại bỏ phần tử đầu danh sách (Front) Bổ sung  CuuDuongThanCong.com https://fb.com/tailieudientucntt 12 .c om Khi mô tả Queue mảng, ta có hai số Front Rear lưu số phần tử đầu số cuối Queue, khởi tạo Queue rỗng: Front = Rear = 0; co ng  an  Để thêm phần tử vào Queue, ta tăng Rear lên cu u du o ng th đưa giá trị vào phần tử thứ Rear  Để loại phần tử khỏi Queue, ta lấy giá trị vị trí Front tăng Front lên  Khi Rear tăng lên hết khoảng số mảng mảng đầy, đẩy thêm phần tử vào  Khi Front > Rear tức Queue rỗng  Như phần mảng từ vị trí Front tới Rear sử dụng làm Queue CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 .c om int Pop() { if (Front > Rear) { printf(“Queue is empty”); return -1; } else { int res = Queue[Front]; Front++; return res; } } ng #define max = 10000 int Queue[max]; int Front, Rear; an co void QueueInit { Front = 1; Rear = 0; } cu u du o ng th void Push(int V) { if (Rear >= max-1) printf(“Queue is full”); else { Rear++; Queue[Rear] = V; } } Độ phức tạp tính toán thao tác Init, Push, Pop đểu Θ(1) CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 .c om  Nhược điểm: ng  Trong cách cài đặt mảng ta thấy số Rear cu u du o ng th an co Front tăng lên không giảm đi, kể lấy phần tử khỏi hàng đợi: Chỉ có phần tử từ vị trí Front tới Rear thuộc Queue, phần tử từ vị trí tới Front - bị lãng phí  Nhược điểm khơng có cài đặt ngăn xếp (vì số Top ngăn xếp tăng lại giảm thao tác thêm vào/lấy ra)  Để khắc phục nhược điểm này: biểu diễn danh sách vòng CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 .c om ng co ng th an Danh sách vịng biểu diễn hàng đợi cài đặt mảng danh sách liên kết Ở ta xét phép cài đặt mảng:  Coi phần tử mảng xếp quanh vòng theo cu u du o hướng  Các phần tử nằm phần cung tròn từ vị trí Front tới vị trí Rear phần tử Queue  Thêm phần tử vào Queue: dịch số Rear theo vịng vị trí đặt giá trị vào  Loại bỏ phần tử Queue: lấy phần tử vị trí Front dịch số Front theo vòng CuuDuongThanCong.com https://fb.com/tailieudientucntt 16 .c om int Pop() { if (n == 0) { printf(“Queue is Empty”); return -1; } else { int res = Queue[Front]; Front = (Front+1)% max; n ; return res; } } ng #define max = 10000 int Queue[max]; int Front, Rear , i, n; th an co void QueueInit { n = Front = 0; Rear = max - 1; } cu u du o ng void Push(int V) { if (n>=max) printf(“Queue’s full”); else { Rear = (Rear+1) % max; Queue[Rear] = V; n++; } } Độ phức tạp tính tốn thao tác Init, Push, Pop đểu Θ(1) CuuDuongThanCong.com https://fb.com/tailieudientucntt 17 cu u du o CuuDuongThanCong.com c om ng an co int Pop() { if (Front == NULL) { printf(“Queue is empty”); return -1; } else { int res = Front->data; TNode * P = Front->next; free(Front); Front := P; return res; } } th ng typedef struct node { int data; TNode *next; } TNode; TNode * Front, Rear; void QueueInit(){ Front = NULL; } void Push(int V) { TNode * P = (TNode *) malloc(sizeof(TNode)); P->data = V; if (Front==NULL) Front = P; else Rear->next = P; Rear = P; } https://fb.com/tailieudientucntt 18 .c om Bài tốn tìm kiếm theo chiều rộng đồ thị, Thuật toán loang Queue dùng hầu hết hệ điều hành để xếp thứ tự tiến trình truy cập vào tài nguyên,  Dùng hệ thống mạng để xếp hàng chờ cho gói tin trước định tuyến chúng đến hướng đích,  Một biến thể hàng đợi hàng đợi có độ ưu tiên (priority queue hay cịn gọi heap) dùng du o ng th an co ng     Trong thuật toán xếp hiệu thuật toán xếp cu u kiểu vun đống (heap sort),  Dùng tốn quản lý băng thơng,  Bài tốn tìm đường ngắn đồ thị có trọng số,  Trong số thuật tốn mã hóa giải mã (như thuật toán Huffman) CuuDuongThanCong.com https://fb.com/tailieudientucntt 19 .c om ng co an th u du o ng Một đoàn tàu chứa n toa tàu đánh số từ đến n nằm đường ray A Do nhu cầu vận chuyển, người ta muốn xếp lại toa tàu theo thứ tự chuyển đồn tàu với thứ tự toa qua đường ray C Thứ tự hoán vị (1, 2, …, n) Quy tắc chuyển sau: đưa toa tàu chạy theo đường ray theo hướng mũi tên, dùng đoạn đường ray B (dường tránh) để chứa tạm toa tàu trình di chuyển 20 cu  CuuDuongThanCong.com https://fb.com/tailieudientucntt ... https://fb.com/tailieudientucntt 11 .c om Hàng đợi kiểu danh sách trang bị hai phép toán: co ng   bổ sung phần tử vào cuối Loại bỏ Đầu Cuối Có thể hình dung hàng đợi đoàn người xếp hàng mua vé: Người xếp hàng trước mua... điều hành để xếp thứ tự tiến trình truy cập vào tài nguyên,  Dùng hệ thống mạng để xếp hàng chờ cho gói tin trước định tuyến chúng đến hướng đích,  Một biến thể hàng đợi hàng đợi có độ ưu tiên... lấy phần tử khỏi hàng đợi: Chỉ có phần tử từ vị trí Front tới Rear thuộc Queue, phần tử từ vị trí tới Front - bị lãng phí  Nhược điểm khơng có cài đặt ngăn xếp (vì số Top ngăn xếp tăng lại giảm

Ngày đăng: 20/11/2022, 15:25

w