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

Bài giảng cấu trúc dữ liệu và giải thuật ngăn xếp TS đào nam anh

69 123 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 69
Dung lượng 0,97 MB

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

Nội dung

Khái niệm Stack• Stack là một danh sách mà các đối tượng được thêm vào và lấy ra chỉ ở một đầu của danh sách A stack is simply a list of elements with insertions and deletions permitt

Trang 1

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

NGĂN XẾP

Dr Dao Nam Anh

Trang 2

Outline – Nội dung

• Stack - Ngăn xếp

 Khái niệm Stack

 Các thao tác trên Stack

 Hiện thực Stack

 Ứng dụng của Stack

Trang 3

edit by Dao Nam Anh Major Reference:

• Robert Sedgewick, and Kevin Wayne, “Algorithms”

Princeton University, 2011, Addison Wesley

• Algorithm in C (Parts 1-5 Bundle)- Third Edition by

Robert Sedgewick, Addison-Wesley

• Cấu trúc dữ liệu và giải thuật, Đinh Mạnh Tường.

• Giải thuật và lập trình, Lê Minh Hoàng, Đại Học

Trang 4

Khái niệm Stack

Stack là một danh sách mà các đối tượng được

thêm vào và lấy ra chỉ ở một đầu của danh sách

(A stack is simply a list of elements with insertions and deletions

permitted at one end)

• Việc thêm một đối tượng vào Stack hoặc lấy một

đối tượng ra khỏi Stack được thực hiện theo cơ

chế LIFO (Last In First Out - Vào sau ra trước)

• Các đối tượng có thể được thêm vào Stack bất kỳ

lúc nào nhưng chỉ có đối tượng thêm vào sau

cùng mới được phép lấy ra khỏi Stack

Trang 5

thêm vào và lấy ra chỉ ở một đầu của danh sách

(A stack is simply a list of elements with insertions and deletions

permitted at one end)

• Việc thêm một đối tượng vào Stack hoặc lấy một

đối tượng ra khỏi Stack được thực hiện theo cơ

chế LIFO (Last In First Out - Vào sau ra trước)

• Các đối tượng có thể được thêm vào Stack bất kỳ

lúc nào nhưng chỉ có đối tượng thêm vào sau

Trang 6

Khái niệm Stack

• Ví dụ: Chồng sách, chồng đĩa

• LAST IN FIRST OUT (LIFO)

data structure

Trang 7

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

push

Trang 8

Các thao tác Stack

• Stack hỗ trợ 2 thao tác chính:

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

push

Trang 9

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

Trang 10

Các thao tác Stack

• Stack hỗ trợ 2 thao tác chính:

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

pop

Trang 11

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

pop

Trang 12

Các thao tác Stack

• Stack hỗ trợ 2 thao tác chính:

 “Push”: Thao tác thêm 1 đối tượng vào Stack

 “Pop”: Thao tác lấy 1 đối tượng ra khỏi Stack

push

pop

Trang 13

isEmpty(): Kiểm tra xem Stack có rỗng không

Top(): Trả về giá trị của phần tử nằm ở đầu Stack

mà không hủy nó khỏi Stack Nếu Stack rỗng thì

lỗi sẽ xảy ra

Trang 14

Stack implementation - Triển khai ngăn xếp

• Ngăn xếp là cấu trúc dữ liệu

• Đối tượng có thể là Integer, Double, String, hoặc,

Employee, Student

• Triển khai ngăn xếp như thế nào?

Bằng mảng hoặc bằng danh sách liên kết

• Stack is an abstract data structure

• Item can be Integer, Double, String, and also can be any data type, such as

Employee, Student…

• How to implement a general stack for all those types?

Trang 15

Kích thước cố định

Kiểm tra còn chỗ không: isFull( ).

• Cần biến chỉ vị trí “top of a stack”.

• Rỗng khi Top = –1

Linked List – Danh sách liên kết

Kích thước linh hoạt

• Cần con trỏ (pointer), trỏ về đỉnh ngăn xếp (top of

stack).

Trang 16

Array Implementation of Stack

Triển khai ngăn xếp bằng mảng

Trang 17

Thao tác trên Stack

Trang 18

Push() and pop() operations

Trang 20

Array Implementation of Stack – Triển khai ngăn xếp bằng mảng

Khai báo Stack:

const int size = 100;

class stack

{

private : // data declaration

int top ; char data[size] ; public : // function declaration

void createStack();

void push(char) ; // insert operation

void pop() ; // delete operation

char stackTop() ; // get top value

bool isFull() ; // check if stack is Full

bool isEmpty(); // check if stack is empty

} ;

Trang 21

• Kích thước:100.

• Khai báo:

stack aStack;

Trang 22

Array Implementation of Stack – Triển khai ngăn xếp bằng mảng

Trang 24

Array Implementation of Stack –

Triển khai ngăn xếp bằng mảng

Trang 25

 Top will be increased by 1

top = top + 1;

 New item will be inserted at the top

data[Top] = newItem;

before push()

Trang 26

Array Implementation of Stack –

Triển khai ngăn xếp bằng mảng

void stack::push(char newitem)

{

if (isFull()) // check whether stack is full

cout << “Sorry,Cannot push item

Stack is now full!"<< endl;

else

{ top = top + 1 // Top point to next index

data[top] = newitem; //assign new item at top

}//end else

}//end push()

Trang 27

pop() Operation

isEmpty() kiểm tra có ngăn nào không.

pop() giảm giá trị của top 1:

top = top - 1;

Trang 28

Array Implementation of Stack –

Triển khai ngăn xếp bằng mảng

void stack::pop()

{

char item;

if ( isEmpty() )

cout << “Sorry, Cannot pop item

Stack is empty!” << endl;

else

{ //display value at top to be deleted

cout << “Popped value :” << data[top];

top = top – 1;

// top will hold to new index

}// end if

}//end pop

Trang 30

Array Implementation of Stack – Triển khai ngăn xếp bằng mảng

Nhận xét:

• Các thao tác trên đều làm việc với chi phí O(l)

• Việc cài đặt Stack thông qua mảng một chiều đơn

giản và khá hiệu quả

• Tuy nhiên, hạn chế lớn nhất của phương án cài

đặt này là giới hạn về kích thước của Stack (N)

• Giá trị của N có thể quá nhỏ so với nhu cầu thực

tế hoặc quá lớn sẽ làm lãng phí bộ nhớ

Trang 32

Linked List Implementation of Stack

Triển khai Ngăn xếp bằng danh sách liên kết

• Có thể tạo một Stack bằng cách sử dụng một danh

sách liên kết đơn (DSLK)

• Khai báo các cấu trúc:

Trang 33

createStack() – initialize top

push(char) – insert item onto stack

pop() – delete item from stack

isEmpty() – check whether a stack is empty.

stackTop() – get item at top

isFull() – không cần thiết

Trang 34

public : // pengisytiharan ahli fungsi

void createStack(); // set Top to NULL

void push(int) ; // insert item into stack

void pop() ; // delete item from stack

int stackTop() ; // get content at top stack

bool isEmpty(); // check whether stack is empty

};

Linked List Implementation of Stack Triển khai Ngăn xếp bằng danh sách liên kết

Trang 35

currently, there is no node in the stack

• Is Empty() stack will return true if stack is empty, top is NULL.

void stack::createStack() {

top = NULL;

}

bool stack::isEmpty() {

return (top == NULL);

}

Trang 37

STEP 1 : newnode-> next = head;

STEP 2 : head = newnode;

Trang 38

push()to non-empty stack

STEP 1 : newnode-> next = head;

STEP 2 : head = newnode;

Trang 39

{ // create newnode

nodeStack *newnode;

newnode = new (nodeStack);

if( newnode == NULL)

cout << “Cannot allocate memory…” << endl;

else // add to empty stack, or to front stack

Trang 40

Delete item from stack (pop)

STEP 1 : delnode = head;

STEP 2 : head = delnode -> next; or head = head->next;STEP 3 :

delete(delnode);

Trang 41

if (isEmpty())

cout <<“Sorry, Cannot pop item from

stack.Stack is still empty!” <<endl;

Trang 42

Check item at top stack

Trang 43

• Stack is a LIFO data structure

Can be implemented using array and link list

• Structure of a stack using array and link list

Basic Operation for a stack

• createStack(),Push(),Pop()

• stackTop(),isEmpty(),isFull()

Trang 44

Application of Stack

- Ứng dụng ngăn xếp

Trang 45

Stack thích hợp lưu trữ các loại dữ liệu mà trình tự truy

xuất ngược với trình tự lưu trữ:

Trong trình biên dịch (thông dịch), khi thực hiện các

thủ tục, Stack được sử dụng để lưu môi trường của

các thủ tục

Lưu dữ liệu khi giải một số bài toán của lý thuyết đồ

thị (như tìm đường đi -Backtracking)

Khử đệ qui

Trang 46

Expression Notations

Infix: Normal, use “()”

1 + 2 * 3 (4+5)*6 RPN (Postfix): Operator last, no “()”

1 2 3 * +

4 5 + 6 * Prefix: Operator first, no “()”

+ 1 * 2 3

Trang 47

• RPN, also known as postfix notation, was

invented by Australian philosopher and computer

scientist Charles Hamblin in the mid-1950s.

Trang 50

Ví dụ 2 RPN

• (4 + 5) / (1 + 2)

 Chuyển sang RPN có dạng như thế nào?

Trang 51

• (4 + 5) / (1 + 2)

 Chuyển sang RPN có dạng như thế nào?

» 4 5 + 1 2 + /

Trang 53

• [(4 + 5) * (2 + 3) + 6] / (8 + 7)

 Chuyển sang RPN có dạng như thế nào?

Trang 54

Ví dụ 3 RPN

• [(4 + 5) * (2 + 3) + 6] / (8 + 7)

 Chuyển sang RPN có dạng như thế nào?

» 4 5 + 2 3 + * 6 + 8 7 + /

Trang 55

• Viết chương trình thực hiện 4 * (3 + 4) là khó.

• Viết chương trình thực hiện 2 3 4 + * là dễ hơn.

 Sử dụng Stack – ngăn xếp.

Trang 56

Use Stack for Parsing RPN Expressions

Sử dụng ngăn xếp trong RPN

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

Trang 57

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

Trang 58

Use Stack for Parsing RPN Expressions

4 3 2

Trang 59

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

4 3 2

4 3 2 +

Trang 60

Use Stack for Parsing RPN Expressions

4 3 2

4 3 2

7 2 +

Trang 61

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

4 3 2

4 3 2

7 2

7 2 +

*

Trang 62

Use Stack for Parsing RPN Expressions

4 3 2

4 3 2

7 2

7

+

*

Trang 63

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

4 3 2

4 3 2

7 2

7

+

*

Trang 64

Use Stack for Parsing RPN Expressions

4 3 2

4 3 2

7 2

7

+

*

Trang 65

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

4 3 2

4 3 2

7 2

7

+

*

Trang 66

Use Stack for Parsing RPN Expressions

4 3 2

4 3 2

7 2

7

+

*

Trang 67

• Chương trình tính RPN sử dụng ngăn xếp

2 3 4 + *

2

3 2

4 3 2

4 3 2

7 2

7

+

*

Trang 68

Thuật toán 2 ngăn xếp của Dijkstra

Trang 69

https://sites.google.com/site/daonamanhedu/data-structure-algorithm

Ngày đăng: 06/11/2017, 12:35

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