Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 34 trang
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