51 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Ðể biểu diễn Stack: Dùng mảng 1 chiều hoặc danh sách liên kết. Mảng 1 chiều Danh sách liên kết ñơn - Viết chương trình dễ dàng, nhanh chóng - Bị hạn chế do số lượng phần tử cố ñịnh - Tốn chi phí tái cấp phát và sao chép vùng nhớ nếu sử dụng mảng ñộng Phức tạp khi triển khai chương trình Không bị cố ñịnh về số phần tử, phụ thuộc vào bộ nhớ This is trial version www.adultpdf.com 52 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM // Giả sử Stack chứa các phần tử kiểu nguyên // Khai báo cấu trúc Stack typedef struct STACK { int* StkArray; // mảng chứa các phần tử int StkMax; // số phần tử tối ña int StkTop; // vị trí ñỉnh Stack }; //Thao tác “Khởi tạo Stack rỗng” int InitStack(STACK& s, int MaxItems) { s.StkArray = new int[MaxItems]; if (s.StkArray == NULL) return 0; // Không cấp phát ñược bộ nhớ s.StkMax = MaxItems; s.StkTop = -1; // chưa có phần tử nào trong Stack return 1; // khởi tạo thành công } Ngăn xếp sử dụng mảng This is trial version www.adultpdf.com 53 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Kiểm tra Stack rỗng” int IsEmpty(const STACK &s) { if (s.StkTop==-1) return 1; // Stack rỗng return 0; // Stack không rỗng } //Thao tác “Kiểm tra Stack ñầy” int IsFull(const STACK &s) { if (s.StkTop==s.StkMax-1) return 1; // Stack ñầy return 0; // Stack chưa ñầy } This is trial version www.adultpdf.com 54 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Push”: thêm một phần tử vào ñỉnh Stack int Push (STACK& s, int newitem) { if (IsFull(s)) return 0; // stack ñầy, không thể thêm s.StkTop++; s.StkArray[s.StkTop] = newitem; return 1; // thêm thành công } //Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh Stack int Pop(STACK& s, int& outitem) { if (IsEmpty(s)) return 0; // Stack rỗng, không lấy ra ñược outitem = s.StkArray[s.StkTop]; s.StkTop ; return 1; // lấy ra thành công } This is trial version www.adultpdf.com 55 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //truy xuất 1 phần tử ở ñỉnh Stack, không làm thay ñổi Stack int StackTop(const STACK s, int& outitem) { if (IsEmpty(s)) return 0; // Stack rỗng, không lấy ra ñược outitem = s.StkArray[s.StkTop]; return 1; // lấy ra thành công } This is trial version www.adultpdf.com 56 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM // Giả sử Stack chứa các phần tử kiểu nguyên // Khai báo cấu trúc một phần tử trong stack typedef struct tagSTACK_NODE { int Data; tagSTACK_NODE *pNext; } STACK_NODE; // Khai báo cấu trúc stack typedef struct STACK { int StkCount; STACK_NODE *StkTop; }; Ngăn xếp sử dụng DSLK This is trial version www.adultpdf.com 57 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Khởi tạo stack rỗng”: void InitStack(STACK& s) { s.StkTop = NULL; s.StkCount = 0; } //Thao tác “Kiểm tra stack rỗng” int IsEmpty(const STACK& s) { if (s.StkTop == NULL) return 1; // stack rỗng return 0; // stack không rỗng } This is trial version www.adultpdf.com 58 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Kiểm tra stack ñầy” int IsFull (const STACK s) { // thử tạo mới một phần tử STACK_NODE* temp = new STACK_NODE; // nếu không tạo ñược stack ñầy if (temp == NULL) return 1; // stack ñầy delete temp; return 0; // stack chưa ñầy } This is trial version www.adultpdf.com 59 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Push”: thêm 1 phần tử vào ñỉnh stack int Push(STACK &s, int newitem) { if (IsFull(s)) return 0; // Stack ñầy, không thêm vào ñược STACK_NODE *pNew = new STACK_NODE; pNew->Data = newitem; pNew->pNext = s.StkTop; s.StkTop = pNew; s.StkCount++; return 1; // Thêm thành công } This is trial version www.adultpdf.com 60 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh stack int Pop(STACK &s, int& outitem) { if (IsEmpty(s)) return 0; // Stack rỗng, không lấy ra ñược // lưu lại con trỏ ñến ptử ñầu STACK_NODE *temp = s.StkTop; outitem = s.StkTop->Data; s.StkTop = s.StkTop->pNext; delete temp; s.StkCount ; return 1; // Lấy ra thành công } This is trial version www.adultpdf.com . trong Stack return 1; // khởi tạo thành công } Ngăn xếp sử dụng mảng This is trial version www.adultpdf.com 53 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //Thao tác “Kiểm. s.StkArray[s.StkTop]; s.StkTop ; return 1; // lấy ra thành công } This is trial version www.adultpdf.com 55 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM //truy xuất 1 phần tử ở ñỉnh. s.StkArray[s.StkTop]; return 1; // lấy ra thành công } This is trial version www.adultpdf.com 56 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM // Giả sử Stack chứa các phần