1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 - ThS. Nguyễn Hà Giang

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

Nội dung

Stack & Queue ThS Nguyễn Hà Giang Hutech - IT Nguyen Ha Giang 2009 Giới thiệu • LIFO: Last In First Out • Thao tác Pop, Push diễn đầu Nguyen Ha Giang 2009 Hiện thực stack Mảng chiều Danh sách LK Cấp phát động! Kích thước stack thiếu, lúc thừa Push/Pop dễ dàng Push / Pop phức tạp Nguyen Ha Giang 2009 Khai báo • Tạo cấu trúc Node cho stack typedef struct node { DataType info; struct node * next; }NODE; typedef NODE * NodePtr; NodePtr pTop; pTop = NULL; Nguyen Ha Giang 2009 pTop quản lý stack Khởi tạo stack Thao tác • Các thao tác stack Pop InitStack Push IsEmpty Top GetSize pTop Đầu danh sách Nguyen Ha Giang 2009 Pop • Pop: – Lấy phần tử đầu danh sách – Trả nội dung giải phóng nút pTop pTop Pop Nguyen Ha Giang 2009 Pop int Pop(NodePtr &pTop) { NodePtr p; int value; if (pTop == NULL) { printf(“Stack is empty!”); return -1; } p = pTop; pTop = pTop->next; value = p->info; FreeNode(p); return value; } Nguyen Ha Giang 2009 Push • Push – Tạo Node – Đưa vào đầu stack pTop pTop Push new Nguyen Ha Giang 2009 9 Push void Push(NodePtr &pTop, int x) { NodePtr node; node = NewNode(); node->info = x; node->next = pTop; pTop = node; } Nguyen Ha Giang 2009 10 Postfix • Duyệt qua phần tử infix  C – Nếu C “(“ push  stack – Nếu C “)” lấy tất phần tử stack gặp “(“ Xuất phần tử – Nếu C toán tử: lấy stack tất toán tử có độ ưu tiên cao C, xuất phần tử ngoài, đưa C vào stack – Ngược lại xuất C ngồi (trường hợp tốn hạng) Nguyen Ha Giang 2009 20 Postfix (2 * + / 8) * (5 – 1) Đọc Xử lý Stack Output ( Đẩy vào stack ( Xuất ( * Do ‘*’ ưu tiên ‘(‘ đỉnh stack (* nên đưa ‘*’ vào stack Xuất 23 + Do ‘+’ ưu tiên thấp ‘*’ đỉnh stack nên ta lấy ‘*’ (+ Tiếp tục so sánh ‘+’ với ‘(‘ ‘+’ ưu tiên cao nên đưa vào stack 23* Xuất 23*7 / Do ‘/’ có độ ưu tiên cao ‘+’ (+/ đỉnh stack nên đưa ‘/’ vào stack 23*7 Xuất 23*78 (* (+ (+/ Nguyen Ha Giang 2009 21 Postfix (2 * + / 8) * (5 – 1) Đọc Xử lý Stack Output ) Lấy stack gặp ngoặc ( * Đưa vào stack * 23*78/+ ( Đưa vào stack *( 23*78/+ Xuất *( 23*78/+5 - Độ ưu tiên ‘-‘ cao ‘(‘ *(đỉnh stack nên đưa ‘-‘ vào stack 23*78/+5 Xuất 23*78/+51 ) Lấy stack gặp * ngoặc đóng 23*78/+51- Lấy phần tử lại stack hiển thị 23*78/+51* 23*78/+ *(- Nguyen Ha Giang 2009 22 Postfix • Tính giá trị biểu thức postfix Postfix khơng cần có dấu ngoặc tính cách đọc biểu thức từ trái qua phải dùng stack để lưu trữ kết trung gian 34*5+ Jan Lukasiewicz Nguyen Ha Giang 2009 23 Postfix Ý tưởng • Khởi tạo stack = {Ø} • Đọc phần tử từ trái, kiểm tra – Nếu toán hạng: Push  stack – Nếu toán tử: lấy hai toán hạng, thực phép toán, kết Push vào stack • Sau đọc xong, stack cịn phần tử  kết quả! Nguyen Ha Giang 2009 24 Nguyen Ha Giang 2009 25 Giới thiệu • FIFO • Thêm vào cuối lấy đầu Nguyen Ha Giang 2009 26 Mơ tả • Queue dùng DSLK – Con trỏ pFront trỏ đầu danh sách – Con trỏ pRear trỏ đến cuối danh sách – Thao tác Remove diễn pFront – Tháo tác Insert diễn pRear – Thao tác thêm xoá dễ dàng hai đầu Nguyen Ha Giang 2009 27 Mô tả • Tạo cấu trúc Node cho Queue typedef struct node { DataType info; struct node * next; }NODE; typedef NODE * NodePtr; struct Queue { NodePtr pFront; NodePtr pRear; } Nguyen Ha Giang 2009 28 Thao tác • Các thao tác Queue – Init – Insert – Remove – QueueFront – QueueRear – QueueSize – Clear Nguyen Ha Giang 2009 29 Insert • Insert pFront pRear new x pFront pRear new Nguyen Ha Giang 2009 x 30 Insert void Insert(Queue &queue, int x) { NodePtr node; node = NewNode(); node->info = x; node->next = NULL; if ( queue.pRear == NULL) { queue.pRear = node; queue.pFront = node; } else { queue.pRear->next = node; queue.pRear = node; } } Nguyen Ha Giang 2009 31 Remove • Remove pFront pRear pFront Nguyen Ha Giang 2009 pRear 32 Remove int Remove(Queue & queue) { NodePtr p; int value; if (queue.pFront == NULL) { printf(“Queue is empty!”); return -1; } if (queue.pFront == queue.pRear) { p = queue.pFront; queue.pFront = queue.pRear = NULL; } else { p =queue.pFront; queue.pFront = p->next; } value = p->info; FreeNode(p); return value; } Nguyen Ha Giang 2009 33 ứng dụng • Ứng dụng Queue – Trong toán hàng đợi “Vào trước trước” FIFO: • Hệ thống print server • Cơ chế thông điệp, đệm, hàng đợi xử lý kiện… • Các ứng dụng đặt vé tàu lửa, máy bay… • Các hệ thống rút tiền… Nguyen Ha Giang 2009 34

Ngày đăng: 16/10/2023, 04:22

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN