Căi đặt ngăn xếp

Một phần của tài liệu Cấu trúc dữ liệu và giải thuật ĐH Cần Thơ (Trang 45 - 48)

II. NGĂN XẾP (STACK)

3.Căi đặt ngăn xếp

a. Căi đặt ngăn xếp bằng danh sâch:

Do ngăn xếp lă một danh sâch đặc biệt nín ta có thể sử dụng kiểu dữ liệu trừu tượng danh sâch để biểu diễn câch căi đặt nó (như đê đề cập trong mục III chương 1). Như vậy, ta có thể khai bâo ngăn xếp như sau:

typedef List Stack;

Khi chúng ta đê dùng danh sâch để biểu diễn cho ngăn xếp thì ta nín sử dụng câc phĩp toân trín danh sâch để căi đặt câc phĩp toân trín ngăn xếp. Sau đđy lă phần căi đặt ngăn xếp bằng danh sâch.

Tạo ngăn xếp rỗng:

void MakeNull_Stack(Stack *S){ MakeNull_List(S);

} Kiểm tra ngăn xếp rỗng: int Empty_Stack(Stack S){ return Empty_List(S); } Thím phần tử văo ngăn xếp

void Push(Elementtype X, Stack *S){ Insert_List (x, First (*S), &S); }

Xóa phần tử ra khỏi ngăn xếp

void Pop (Stack *S){

Delete_List (First (*S), &S); }

Tuy nhiín để tăng tính hiệu quả của ngăn xếp ta có thể căi đặt ngăn xếp trực tiếp từ câc cấu trúc dữ liệu như câc phần sau.

Dùng một mảng để lưu trữ liín tiếp câc phần tử của ngăn xếp. Câc phần tử đưa văo ngăn xếp bắt đầu từ vị trí có chỉ số cao nhất của mảng, xem hình II.9. Ta còn phải dùng một biến số nguyín (TOP_IDX) giữ chỉ số của phần tử tại đỉnh ngăn xếp.

0 1 top_idx → Phần tử thứ 1 Phần tử thứ 2

Maxlength-1 Phần tử cuối cùng (phần tử đầu tiín được thím

văo ngăn xếp)

Hình II.9 Ngăn xếp

Khai bâo ngăn xếp

#define MaxLength ... //độ dăi của mảng

typedef ... ElementType; //kiểu câc phần tử trong ngăn xếp typedef struct {

ElementType Elements[MaxLength]; //Lưu nội dung của câc phần tử

int Top_idx; //giữ vị trí đỉnh ngăn xếp } Stack;

Tạo ngăn xếp rỗng

Ngăn xếp rỗng lă ngăn xếp không chứa bất kỳ một phần tử năo, do đó đỉnh của ngăn xếp không được phĩp chỉ đến bất kỳ vị trí năo trong mảng. Để tiện cho quâ trình thím vă xóa phần tử ra khỏi ngăn xếp, khi tạo ngăn xếp rỗng ta cho đỉnh ngăn xếp nằm ở vị trí maxlength.

void MakeNull_Stack(Stack *S){ S->Top_idx=MaxLength; }

int Empty_Stack(Stack S){ return S.Top_idx==MaxLength; } Kiểm tra ngăn xếp đầy int Full_Stack(Stack S){ return S.Top_idx==0; } Lấy nội dung phần tử tại đỉnh của ngăn xếp :

Hăm trả về nội dung phần tử tại đỉnh của ngăn xếp khi ngăn xếp không rỗng. Nếu ngăn xếp rỗng thì hăm hiển thị cđu thông bâo lỗi.

ElementType Top(Stack S){ if (!Empty_Stack(S))

return S.Elements[S.Top_idx]; else printf("Loi! Ngan xep rong"); }

}

Chú ý Nếu ElementType không thể lă kiểu kết quả trả về của một hăm thì ta có thể viết Hăm Top như sau: (adsbygoogle = window.adsbygoogle || []).push({});

void TOP(Stack S, Elementtype *X){

//Trong đó x sẽ lưu trữ nội dung phần tử tại đỉnh của ngăn xếp

if (!Empty_Stack(S))

*X = S.Elements[S.Top_idx];

else printf(“Loi: Ngan xep rong “); Chương trình con xóa phần tử ra khỏi ngăn xếp

Phần tử được xóa ra khỏi ngăn xếp lă tại đỉnh của ngăn xếp. Do đó, khi xóa ta chỉ cần dịch chuyển đỉnh của ngăn xếp xuống 1 vị trí (top_idx tăng 1 đơn vị )

void Pop(Stack *S){

S->Top_idx=S->Top_idx+1; else printf("Loi! Ngan xep rong!"); }

Chương trình con thím phần tử văo ngăn xếp :

Khi thím phần tử có nội dung x (kiểu ElementType) văo ngăn xếp S (kiểu Stack), trước tiín ta phải kiểm tra xem ngăn xếp có còn chỗ trống để lưu trữ phần tử mới không. Nếu không còn chỗ trống (ngăn xếp đầy) thì bâo lỗi; Ngược lại, dịch chuyển Top_idx lín trín 1 vị trí vă đặt x văo tại vị trí đỉnh mới.

void Push(ElementType X, Stack *S){ if (Full_Stack(*S))

printf("Loi! Ngan xep day!"); else{

S->Top_idx=S->Top_idx-1; S->Elements[S->Top_idx]=X; }

}

Tất nhiín ta cũng có thể căi đặt ngăn xếp bằng con trỏ, trường hợp năy xin dănh cho bạn đọc xem như một băi tập nhỏ.

Một phần của tài liệu Cấu trúc dữ liệu và giải thuật ĐH Cần Thơ (Trang 45 - 48)