5. Danh sách hạn chế
5.2. Ngăn xếp (tt)
5.2.1. Cấu trúc dữ liệu
Biểu diễn và tổ chức bằng danh sách đặc typedef struct SC { int Size; int SP; T * List; } CSTACK; CSTACK CSList;
Biểu diễn và tổ chức bằng danh sách liên kết typedef struct SElement
{ T Key;
SElement *Next; } SOneElement;
typedef struct SOneElement *SSTACK; SSTACK SSP;
5.2. Ngăn xếp (tt)
5.2.2. Các thao tác trên ngăn xếp tổ chức bằng danh sách đặc 5.2.2.a. Khởi tạo ngăn xếp (Initialize)
5.2.2.b. Thêm 1 phần tử vào ngăn xếp (Push)
5.2.2.c. Lấy nội dung 1 phần tử trong ngăn xếp ra xử lý (Pop) 5.2.2.d. Hủy ngăn xếp
103
5.2. Ngăn xếp (tt)
5.2.2.a. Khởi tạo ngăn xếp (dùng danh sách đặc)
B1: CSList.Size = MaxSize
B2: CSList.List = new T[MaxSize] B3: IF (CSList.List == NULL)
Thực hiện BKT
B4: CSList.SP = CSList.Size +1 BKT: Kết thúc
T * CSInitialize(CSTACK &SList, int MaxSize) { SList.Size = MaxSize;
SList.List = new T[MaxSize]; if (SList.List == NULL)
return (NULL);
SList.SP = SList.Size ; return (SList.List);
5.2. Ngăn xếp (tt)
5.2.2.b. Thêm 1 phần tử vào ngăn xếp (dùng danh sách đặc)
B1: IF (CSList.SP == 1) Thực hiện BKT
B2: CSList.SP --
B3: CSList.List[CSList.SP] = NewData BKT: Kết thúc
int CSPush(CSTACK &SList, T NewData) { if (SList.SP == 0) return (-1); SList.SP -= 1; SList.List[SList.SP] = NewData; return (SList.SP); }
105
5.2. Ngăn xếp (tt)
5.2.2.c. Lấy nội dung 1 phần tử trong ngăn xếp ra xử lý (dùng danh sách đặc) B1: IF (CSList.SP == CSList.Size +!) Thực hiện BKT B2: Data = CSList.List[CSList.SP] B3: CSList.SP++ BKT: Kết thúc
int CSPop(CSTACK &SList, T &Data) { if (SList.SP == SList.Size) return (-1); Data = SList.List[SList.SP]; SList.SP += 1; return (1); }
5.2. Ngăn xếp (tt)
5.2.2.d. Hủy ngăn xếp (dùng danh sách đặc)
int CSDelete(CSTACK &SList) {
delete SList.SList; return;
107
5.2. Ngăn xếp (tt)
5.2.2. Các thao tác trên ngăn xếp tổ chức bằng danh sách liên kết 5.2.3.a. Khởi tạo ngăn xếp (Initialize)
5.2.3.b. Thêm 1 phần tử vào ngăn xếp (Push)
5.2.3.c. Lấy nội dung 1 phần tử trong ngăn xếp ra xử lý (Pop) 5.2.3.d. Hủy ngăn xếp
5.2. Ngăn xếp (tt)
5.2.3.a. Khởi tạo ngăn xếp (dùng danh sách liên kết)
SSTACK SSInitialize (SSTACK &SList) { SList = NULL;
return (SList); }
109
5.2. Ngăn xếp (tt)
5.2.3.b. Thêm 1 phần tử vào ngăn xếp (dùng danh sách liên kết)
B1: NewElement = SLLCreateNode(NewData) B2: if (NewElement == NULL) Thực hiện BKT B3: if (SSP == NULL) B3.1: SSP = NewElement B3.2: Thực hiện BKT B4: NewElement ->Next = SSP B5: SSP = NewElement BKT: Kết thúc
5.2. Ngăn xếp (tt)
5.2.3.b. Thêm 1 phần tử vào ngăn xếp (dùng danh sách liên kết)
SSTACK SSPush (SSTACK &SList, T NewData)
{ SSTACK NewElement = SLLCreateNode(NewData); if (NewElement == NULL)
return (NULL);
NewElement ->Next = SList; SList = NewElement;
return (NewElement); }
111
5.2. Ngăn xếp (tt)
5.2.3.c. Lấy nội dung 1 phần tử trong ngăn xếp ra xử lý (dùng danh sách liên kết)
B1: if (SSP == NULL) Thực hiện BKT
B2: TempElement = SSP B3: SSP = SSP ->Next
B4: TempElement ->Next = NULL B5: Data = TempElement->Key B6: delete TempElement-
5.2. Ngăn xếp (tt)
5.2.3.c. Lấy nội dung 1 phần tử trong ngăn xếp ra xử lý (dùng danh sách liên kết)
int SSPop (SSTACK &SList, T &Data) {
if (SList == NULL) return (-1);
SSTACK TempElement = SList; SList = SList ->Next;
TempElement ->Next = NULL; Data = TempElement->Key; delete TempElement;
return (1); }
113
5.2. Ngăn xếp (tt)
5.2.3.d. Hủy ngăn xếp (dùng danh sách liên kết)
void SSDelete (SSTACK &SList) {
while (SList != NULL)
{ SSTACK TempElement = SList; SList = SList ->Next;
TempElement ->Next = NULL; delete TempElement;
} }
5.2. Ngăn xếp (tt)
5.3. Ứng dụng của danh sách hạn chế
Hàng đợi dùng trong nhiều trường hợp lưu trữ dữ liệu cần xử lý tuần tự.
Ngăn xếp dùng trong việc xử lý dữ liệu truy hồi, đặc biệt trong việc xử lý đệ quy của các thuật giải.
115