Cài đặt ngăn xếp bằng mảng

Một phần của tài liệu Cấu trúc dữ liệu và giải thuật - Lê Văn Vinh (Trang 73 - 76)

Để tạo kiểu dữ liệu ngăn xếp, chúng ta cần khai báo một mảng một chiều với kích thƣớc đối đa cho trƣớc (giá trị MAX trong minh họa bên dƣới), và một biến top để cho biết chỉ số của phần tử ở đỉnh ngăn xếp.

Nhƣ chúng ta đã tìm hiểu ở chƣơng 4, khi thao tác trên một mảng, chi phí thêm vào hủy phần tử cuối thấp hơn so với thêm và hủy phần tử đầu vì không phải thực hiện công việc dịch chuyển phần tử. Vì vậy, ở đây chúng ta chọn phần tử cuối mảng là đỉnh đầu của ngăn xếp.

Phần tử 1

0 1 2 top MAX-1

Phần tử 2 Phần tử 3 Phần tử 4 Phần tử n

3

Cấu trúc dữ liệu ngăn xếp đƣợc định nghĩa nhƣ sau: #define MAX Số_phần tử_tối_đa

struct STACK

{

Kiểu_dữ_liệu_của_phần_tử A[MAX]; //Mảng các phần tử của ngăn xếp

int top; //Chỉ số phần tử đỉnh đầu ngăn xếp

};

Cụ thể, khai báo ngăn xếp kiểu số nguyên nhƣ sau: #define MAX 100 //Ngăn xếp chứa tối đa 100 phần tử

struct STACK

{

int A[MAX]; //Mảng các phần tử của ngăn xếp

int top; //Chỉ số phần tử đỉnh đầu ngăn xếp

};

Tiếp theo chúng ta xây dựng các thao tác cơ bản trên ngăn xếp.

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

Ngăn xếp rỗng là ngăn xếp không có phần tử nào. Khi đó chỉ số top của phần tử đầu phải nhỏ hơn không.

void InitStack(STACK& myStack) {

myStack.top=-1; }

Kiểm tra ngăn xếp rỗng

int IsEmptyStack(STACK& myStack) {

if(myStack.top==-1)//Ngăn xếp rỗng return 1;

return 0;//Ngăn xếp không rỗng }

Kiểm tra ngăn xếp đầy hay không

Ngăn xếp đầy khi nó lƣu trữ đủ số phần tử đƣợc cấp phát từ ban đầu. Chúng ta so sánh giá trị top và MAX để biết ngăn xếp đầy hay chƣa.

int IsFullStack(STACK& myStack) {

if(myStack.top==MAX-1)//Ngăn xếp đầy return 1;

return 0;//Ngăn xếp chƣa đầy }

Thêm một phần tử vào ngăn xếp

Trƣớc khi thêm một phần tử vào ngăn xếp, cần kiểm tra xem ngăn xếp có đầy hay không. Nếu ngăn xếp đầy thì thao tác thêm sẽ không đƣợc thực hiện. Quá trình thêm gồm hai công việc: (1) Gán giá trị thêm vào vị trí top+1 và (2) tăng giá trị top lên 1 đơn vị.

void Push(STACK& myStack, int x) {

if(IsFullStack(myStack))

cout<<"\nNgan xep day!"; else { myStack.A[myStack.top+1]=x; myStack.top++; } }

Lấy thông tin phần tử ở đỉnh ngăn xếp

Thao tác này chỉ lấy thông tin ở vị trí top, không loại bỏ phần tử này khỏi ngăn xếp.

int Top(STACK myStack) {

return myStack.A[myStack.top]; }

Trích hủy phần tử ở đỉnh ngăn xếp

Thao tác này lấy thông tin phần tử đầu và loại bỏ nó ra khỏi ngăn xếp. Chúng ta chỉ cần giảm giá trị chỉ số top để loại bỏ phần tử đầu.

int Pop(STACK& myStack) { int t=myStack.A[myStack.top]; myStack.top--; return t; }  Nhận xét

Ƣu điểm của việc cài đặt ngăn xếp bằng mảng là đơn giản, dễ hiểu, dễ cài đặt. Tuy nhiên, nó cũng có những hạn chế giống nhƣ việc sử dụng mảng để cài đặt cho kiểu danh sách (danh sách đặc). Phần tiếp theo, chúng ta tìm hiểu cách xây dựng ngăn xếp bằng kiểu con trỏ.

Một phần của tài liệu Cấu trúc dữ liệu và giải thuật - Lê Văn Vinh (Trang 73 - 76)

Tải bản đầy đủ (PDF)

(115 trang)