1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng cấu trúc dữ liệu và giải thuật – bài 10 ứng dụng của ngăn xếp

24 7 0

Đ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

Định dạng
Số trang 24
Dung lượng 498,74 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chuy ển đổi từ hệ thập phân sang hệ nhị phân.. Chuy ển đổi từ hệ nhị phân sang hệ thập phân.. Chuy ển đổi từ hệ thập phân sang hệ 16.. Chuy ển đổi từ hệ 16 sang hệ thập phân...  Chuy ển

Trang 1

Gi ảng viên: TS Ngo Huu Phuc

Tel: 0438 326 077 Mob: 098 5696 580

C ấu trúc dữ liệu và giải thuật

Trang 2

Bài 10 M ột vài ứng dụng của Stack

1 Data structures and Algorithms Stacks.htm

2 Kyle Loudon Mastering Algorithms, Chapter 6 Stacks and Queues

3 Elliz Horowitz – Fundamentals of Data Structures, Chapter 3 Stacks and

Queues

4 Deshpande Kakle – C and Data Structures, Chapter 19 Stacks and

Queues

Trang 3

10.1 Đảo mảng (1/3)

 Cho m ột mảng gồm một dãy các giá trị.

 Để đảo thứ tự các phần tử trong mảng, sử dụng nguyên lý Last-In-First-Out c ủa Stack.

 Ví d ụ về hoạt động của đảo mảng:

17 23 25 18

18

25 23 17

134 47 55 216

216

55 47 134

Trang 4

10.1 Đảo mảng (2/3)

Ý t ưởng thực hiện giải thuật:

1 Kh ởi tạo một Stack rỗng, có kiểu số.

2 V ới n phần tử của mảng, lần lượt đưa vào Stack

thông qua hàm Push:

Push a[i] in to Stack.

3 L ần lượt lấy ra từ Stack n phần tử và đưa vào trở

l ại mảng ban đầu:

Pop a item from nStack in to a[i].

4 K ết thúc giải thuật.

Trang 6

10.2 Đảo chuỗi (1/4)

 Cho m ột chuỗi gồm nhiều từ.

 Đảo chuỗi thực hiện việc đảo các từ trong chuỗi, sử

d ụng ý tưởng Last-In-First-Out của Stack.

 Ví d ụ về đảo chuỗi:

Tôi Làm Bài

T ập

T ập Bài Làm Tôi

Chăm

H ọc Thì

Gi ỏi

Gi ỏi Thì

H ọc Chăm

Trang 7

Push mWord into wStack.

3 Đọc từ wStack cho đến hết, thực hiện:

Pop a word from wStack into mWord.

Concate mWord to the end of outp string.

4 D ừng giải thuật.

Chú ý: c ần xây dựng hàm tách word từ string.

Trang 8

void push(char* stack[], char* value, int* top);

char* pop(char* stack[], int* top);

char *p=pop(stack,&top);

while(top>=0){

p=strcat(p," ");

p=strcat(p,pop(stack,&top));

}printf("Chuoi ket qua \n");

puts(p);

getch();

}

Trang 10

10.3 Chuy ển đổi hệ số (1/9)

 Các h ệ số hay sử dụng: hệ thập phân (Decimal), hệ

nh ị phân (Binary), hệ 16 (Hexadecimal).

 Con người thường sử dụng hệ thập phân.

 Đối với máy tính, thường sử dụng hệ nhị phân.

 H ệ 16 là hệ trung gian giữa hệ thập phân và hệ nhị phân.

 Ví d ụ: 111 = (01101111)B = (6F)H

Trang 11

10.3 Chuy ển đổi hệ số (2/9)

Vi ệc chuyển đổi giữa các hệ số thường xét:

1 Chuy ển đổi từ hệ thập phân sang hệ nhị phân.

2 Chuy ển đổi từ hệ nhị phân sang hệ thập phân.

3 Chuy ển đổi từ hệ thập phân sang hệ 16.

4 Chuy ển đổi từ hệ 16 sang hệ thập phân.

Trang 12

10.3 Chuy ển đổi hệ số (3/9)

 Kh ởi tạo một Stack rỗng.

 Chuy ển đổi số từ dạng thập phân sang nhị phân bằng

phép div và mod cho 2.

 K ết quả của phép mod được đưa vào Stack.

 Đọc từ Stack cho đến hết, kết quả được nối với nhau để

t ạo thành chuỗi.

 K ết thúc giải thuật.

Trang 14

10.3 Chuy ển đổi hệ số (3/9)

d ụng Stack:

 Kh ởi tạo một Stack rỗng.

 Chuy ển đổi số từ dạng thập phân sang nhị phân bằng

phép div và mod cho 16.

 K ết quả của phép mod được đưa vào Stack.

 Đọc từ Stack cho đến hết, kết quả được nối với nhau để

t ạo thành chuỗi.

 K ết thúc giải thuật.

Trang 15

}mString[i]='\0';

returnmString;

}

Trang 16

• m ột đoạn biểu thức nằm giữa một cặp dấu ngoặc trái,

ph ải được gọi là sử dụng đúng dấu ngoặc.

Trang 18

10.4 Bracket Matching (3/6)

Gi ải thuật kiểm tra sử dụng dấu ngoặc:

1 T ạo một bStack rỗng (Stack chứa dấu ngoặc).

2 V ới mỗi ký hiệu sym trong đoạn (từ trái sang phải) :

2.1 N ếu sym là dấu ngoặc trái:

2.1.1 Đưa sym vào bStack

2.2 N ếu sym là dấu ngoặc phải:

2.2.1 N ếu bStack rỗng, return false.

2.2.2 L ấy dấu ngoặc ở bStack, đưa vào biến left.

2.2.3 N ếu left và sym không khớp được với nhau,

return false.

3 D ừng giải thuật, trả về True nếu bStack rỗng, hoặc

False v ới các trường hợp khác.

Trang 19

void push(charbStack[], char value,int *top);

charpop(charbStack[], int *top);

int isEmpty(char bStack[],inttop);

int isFull(charbStack[], int top);

void makeEmpty(intbStack[],int* top);

intbracketMatching(char* a,char bStack[], int *top);

Trang 20

kt=0;

elsecharch=pop(bStack,top);

}}

Trang 22

 Như vậy, trong giải thuật trên, cần lưu ý thêm quá

trình push và pop vào bStack:

 N ếu quá trình push vào bStack có dạng: (, [, {.

 Quá trình pop t ừ bStack cần đúng thứ tự: }, ], ).

 N ếu đã duyệt xong biểu thức và bStack rỗng → return True, ngược lại, return False.

Trang 23

for(int i=0;i<strlen(a);i++) {

if(a[i]=='(' || a[i]=='[' || a[i] == '{')push(bStack,a[i],top);

if(a[i]==')' || a[i]=='}' || a[i]==']'){

if(isEmpty(bStack,*top))kt=0;

else {

charch=pop(bStack,top);

if(!matching(ch,a[i])) kt=0; }}

}

if(!isEmpty(bStack,*top)) kt=0;

Ngày đăng: 26/12/2021, 17:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w