1. Trang chủ
  2. » Giáo án - Bài giảng

Ngăn xếp và hàng đợi

11 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Stack and Queue
Chuyên ngành Computer Science
Thể loại Lecture Notes
Định dạng
Số trang 11
Dung lượng 268,71 KB

Nội dung

• Phép toán bổ sung một phần vào ngăn xếp hoặc lấy ra một phần tử ra khỏi ngăn xếp chỉ thực hiênh ở một đầu gọi là đỉnh ngăn xếp.. • Phần tử đưa vào ngăn xếp sau sẽ được lấy ra sử lí trư

Trang 1

STACK AND QUEUE (Ngăn xếp + Hàng đợi)

I Stack (Ngăn xếp)

1 Định nghĩa

• Là một danh sách tuyến tính

• Phép toán bổ sung một phần vào ngăn xếp hoặc lấy ra một phần tử ra khỏi

ngăn xếp chỉ thực hiênh ở một đầu gọi là đỉnh ngăn xếp

• Phần tử đưa vào ngăn xếp sau sẽ được lấy ra sử lí trước

và phần tử đưa vào ngăn xếp trước sẽ được lấy ra xử lý sau

• Được gọi là danh sách LIFO - Last In – First – Out

• Hình ảnh minh họa

2 Các thao tác trên ngăn xếp

1 – Struct Stack: Định nghĩa cấu trục dữ liệu của ngăn xếp

2 – CreateStack(): Khởi tạo ngăn xếp

3 - isEmpty(): kiểm tra xem stack có rỗng hay không

4 – IsFull() : Kiểm tra ngăn xêp scos đầy hay không

5 – Push(x,s) : Thêm một phần tử vào ngăn xếp

Trang 2

6 – Pop(s,x) : Lấy ra một phần tử ra khỏi ngăn xếp và trả lại giá trị phần tử

7 - Top() : trả về giá trị phần tử nạp sau cùng vào ngăn xếp

8 – Size() : Trả lại số lượng phần tử trong ngăn xếp

………

9 – CopyStack() : copystack thành stack thành stack mới

❖ Viết hàm

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

◼ Có thể tạo một Stack bằng cách khai báo một mảng 1 chiều với kích thước tối đa là N (ví dụ: N =1000)

◼ Stack có thể chứa tối đa N phần tử đánh số từ 0 đến N-1

◼ Phần tử nằm ở đầu stack sẽ có chỉ số t (Top) (lúc đó trong stack đang chứa t +1 phần tử)

◼ Để khai báo một Stack, ta cần một mảng 1 chiều S, biến nguyên t cho biết chỉ số của đầu stack và hằng số N cho biết kích thước

tối đa của stack

Data S [N];

int top;

1 Hàm Struct Stack : Định nghĩa cấu trục dữ liêụ của ngăn

xếp

//Định nghĩa cấu trúc ngăn xếp

struct STACK

{

Trang 3

int a[MAX]; //Mảng cấu trúc các phần tử cảu ngăn xếp

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

};

2 Hàm CreateStack() : Khởi tạo ngăn xếp

//Khởi tạo ngăn xếp rỗng

void CreateStack( STACK & s ) {

s top = -1; //Ngăn xếp rỗng khi chỉ số top của phần tu đầu nhỏ hơn 0

}

3 Hàm isEmpty() : kiểm tra xem stack có rỗng hay không

//Ngăn xếp có rỗng

int IsEmpty_1( STACK & s ) {

if ( s top == -1)

return 0;

return 1; //Ngăn xếp ko rỗng

} int IsEmpty( STACK ) {

return ( s top == 0);

}

//Thêm một phần tử vào đầu danh sách

4 Hàm IsFull() : Kiểm tra ngăn xêp có đầy hay không

//Ngăn xếp có đầy hay không

int IsFull_1( STACK ) {

if ( s top == MAX - 1)

return 1; //Đầy

return 0;

} int IsFull( STACK ) {

return( top == MAX);

}

Trang 4

5 Hàm Push(x) : Thêm một phần tử vào ngăn xếp

//Thêm một phần tử vào đầu danh sách

void Push( STACK & s , int )

{

if (IsFull( s )) cout << "Ngan xep day";

else {

s a[ s top + 1] = x ; //Gán giá trị thêm vào vị trí top+1

s top++; //Tăng giá trị top lên 1 đơn vị

}

}

6 Hàm Pop() : Lấy ra một phần tử ra khỏi ngăn xếp và trả lại giá trị phần tử (xóa và lấy dữ liệu)

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

void Pop_1( STACK & s , int )

{

if (IsEmpty( s ) == 0)

cout << "Danh sach rong, khong xoa duoc";

else

{

t = s a[ s top];

s top ;

}

}

int Pop( STACK & s )

{

if (IsEmpty( s ) == 0)

{

cout << "Danh sach rong, khong xoa duoc";

return -1;

}

else

{

int t = s a[ s top];

s top ;

return t;

}

}

Trang 5

7 Hàm Top() : trả về giá trị phần tử nạp sau cùng vào ngăn xếp (lấy dữ liệu tại Top và không xóa)

int Top(Stack s) {

return s.a[s.t-1];

}

Hàm đầy đủ

//STACK VỚI MẢNG NHẬP XUẤT

#include <iostream>

using namespace std;

const int MAX = 100;

//Cài đặt dùng mảng

//Định nghĩa cấu trúc ngăn xếp

struct STACK

{

int a[MAX]; //Mảng cấu trúc các phần tử cảu ngăn xếp

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

};

//Khởi tạo ngăn xếp rỗng

void CreatStack( STACK & s )

{

s top = -1; //Ngăn xếp rỗng khi chỉ số top của phần tu đầu nhỏ hơn 0

}

//Ngăn xếp có đầy hay không

int IsFull_1( STACK )

{

if ( s top == MAX - 1)

return 1; //Đầy

return 0;

}

int IsFull( STACK )

{

return( top == MAX);

}

//Ngăn xếp có rỗng

Trang 6

int IsEmpty_1( STACK & s )

{

if ( s top == -1)

return 0;

return 1; //Ngăn xếp ko rỗng

}

int IsEmpty( STACK )

{

return ( s top == 0);

}

//Thêm một phần tử vào đầu danh sách

void Push( STACK & s , int )

{

if (IsFull( s ))

cout << "Ngan xep day";

else

{

s a[ s top + 1] = x ; //Gán giá trị thêm vào vị trí top+1

s top++; //Tăng giá trị top lên 1 đơn vị

}

}

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

void Pop_1( STACK & s , int )

{

if (IsEmpty( s ) == 0)

cout << "Danh sach rong, khong xoa duoc";

else

{

t = s a[ s top];

s top ;

}

}

int Pop( STACK & s )

{

if (IsEmpty( s ) == 0)

{

cout << "Danh sach rong, khong xoa duoc";

return -1;

}

else

{

int t = s a[ s top];

s top ;

return t;

}

}

//Nhập

void TaoStack( STACK & s )

{

CreatStack( s );

int n, x;

Trang 7

cout << "Nhap vao so luong phan tu trong STACK: ";

cin >> n;

for (int i = 0; i < n; i++)

{

cout << "Nhap vao phan tu x=: ";

cin >> x;

Push( s , x);

}

}

//In ra

void InStack( STACK & s )

{

while (IsEmpty( s ) != 0)

cout << Pop( s ) << " ";

}

//In ra nhưng mảng ngược

void InStack_1( STACK & s )

{

for (int i = s top; i >= 0; i )

{

cout << s a[i] << " ";

}

}

void main()

{

STACK s;

TaoStack(s);

cout << "Lay ra: ";

InStack(s);

}

➢ Cài đặt ngăn xếp bằng danh sách liên kết

Trang 8

//STACK VỚI DANH SÁCH LIÊN KẾT ĐƠN NHẬP XUẤT

#include<iostream>

using namespace std;

struct StackNode

{

int Info;

StackNode *Next;

};

typedef StackNode SNODE;

struct Stack

{

SNODE *pHead;

SNODE *pTail;

};

typedef Stack STACK;

void CreatStack(STACK &s)

{

s.pHead = s.pTail = NULL;

}

SNODE *CreatNode(int x)

{

SNODE *p = new SNODE;

if (p == NULL)

exit(1); // do k dc cap phat bo nho p->Info = x;

p->Next = NULL;

return p;

}

bool IsEmpty(Stack s)

{

if (s.pHead == NULL)

return true;

return false;

Trang 9

}

void Push(Stack &s, int x)

{

SNODE *p = CreatNode(x);

if (IsEmpty(s))

s.pHead = s.pTail = p;

else

{

p->Next = s.pHead; // chan vao dau stack s.pHead = p; // cap nhat head

}

}

int Pop(Stack &s)

{

if (!IsEmpty(s))

{

SNODE *p = s.pHead; // lay top ra khoi stack s.pHead = s.pTail->Next;

return p->Info;

delete p;

}

return 0;

}

void TaoStack(Stack &s)

{

int n, x;

cout << "\nNhap so luong phan tu ban dau n = "; cin >> n;

for (int i = 1; i <= n; i++)

{

cout << "Nhap vao gia tri x: "; cin >> x;

Push(s, x);

}

}

void InStack(Stack s)

{

if (!IsEmpty(s))

{

SNODE *p = s.pHead;

while (p != NULL)

Trang 10

{

cout << p->Info;

p = p->Next;

cout << " "; }

}

}

void main()

{

STACK s;

CreatStack(s);

TaoStack(s);

InStack(s);

}

I Queue (Hàng đợi)

1 Định nghĩa

• Hàng đợi là một cấu trúc dữ liệu gần giống với ngăn xếp, nhưng khác với ngăn xếp ở nguyên tắc chọn phần tử cần lấy ra khỏi tập phần tử

• Trái ngược với ngăn xếp, phần tử được lấy ra khỏi hàng đợi không phải là phần tử mới nhất được đưa vào mà là phần tử đã được lưu trong hàng đợi lâu nhất

Quy luật này của hàng đợi còn được gọi là Vào trước – Ra trước (First in – First out) - FIFO

2 Các thao tác trên ngăn xếp

1 EnQueue(o):Thêm đối tượng o vào cuối hàng đợi

2 DeQueue(): Lấy đối tượng ở đầu queue ra khỏi hàng đợi và trả về giá trị của nó Nếu hàng đợi rỗng thì lỗi sẽ xảy ra

3 Empty(): Kiểm tra xem hàng đợi có rỗng không

Trang 11

4 Front(): Trả về giá trị của phần tử nằm ở đầu hàng đợi mà không hủy nó Nếu hàng đợi rỗng thì lỗi sẽ xảy ra

❖ Viết hàm

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

Có thể tạo một hàng đợi bằng cách sử dụng một mảng 1 chiều với kích thước tối đa là N (ví dụ, N=1000) theo kiểu xoay vòng (coi phần tử an-1 kề với phần tử a0)  Hàng đợi chứa tối đa N phần tử

Phần tử ở đầu hàng đợi (front element) sẽ có chỉ số f Phần tử ở cuối hàng đợi (rear element) sẽ có chỉ số r

Ngày đăng: 03/11/2024, 15:48

w