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 1CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
NGĂN XẾP
Dr Dao Nam Anh
Trang 2Outline – 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 3edit 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 4Khá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 5thê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 6Khá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 8Cá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 10Cá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 12Cá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 14Stack 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 16Array Implementation of Stack
Triển khai ngăn xếp bằng mảng
Trang 17Thao tác trên Stack
Trang 18Push() and pop() operations
Trang 20Array 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 22Array Implementation of Stack – Triển khai ngăn xếp bằng mảng
Trang 24Array 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 26Array 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 27pop() 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 28Array 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 30Array 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 32Linked 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 34public : // 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 35currently, 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 37STEP 1 : newnode-> next = head;
STEP 2 : head = newnode;
Trang 38push()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 40Delete item from stack (pop)
STEP 1 : delnode = head;
STEP 2 : head = delnode -> next; or head = head->next;STEP 3 :
delete(delnode);
Trang 41if (isEmpty())
cout <<“Sorry, Cannot pop item from
stack.Stack is still empty!” <<endl;
Trang 42Check 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 44Application of Stack
- Ứng dụng ngăn xếp
Trang 45Stack 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 46Expression 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 50Ví 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 54Ví 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 56Use 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 58Use 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 60Use 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 62Use 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 64Use 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 66Use 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 68Thuật toán 2 ngăn xếp của Dijkstra
Trang 69•
https://sites.google.com/site/daonamanhedu/data-structure-algorithm