Tải bản đầy đủ (.pdf) (74 trang)

Bài giảng cấu trúc dữ liệu và giải thuật chương 5 ths thiều quang trung

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.22 MB, 74 trang )

CHƯƠNG 5
KIỂU NGĂN XẾP, HÀNG ĐỢI, ĐỆ QUY
GV Th.S. Thiều Quang Trung
Trường Cao đẳng Kinh tế Đối ngoại


Nội dung

1
2
3
4
5
6

• Khái niệm ngăn xếp
• Phương pháp xây dựng stack

• Các thao tác cơ bản trên stack
• Kiểu queue - hàng đợi
• Các thao tác cơ bản trên queue
• Đệ qui và các bài toán đệ qui
GV. Thiều Quang Trung

2


Ngăn xếp - Định nghĩa
• Stack là 1 cấu trúc:
– Gồm nhiều phần tử
– Hoạt động theo cơ chế “Vào sau – Ra trước”


(LIFO – Last In, First Out)
Đỉnh
ngăn
xếp

GV. Thiều Quang Trung

3


Thao tác cơ bản trên Stack






InitStack: khởi tạo Stack rỗng
IsEmpty: kiểm tra Stack rỗng?
Push
IsFull: kiểm tra Stack đầy?
Push: thêm 1 phần tử vào Stack
Pop: lấy ra 1 phần tử khỏi Stack

GV. Thiều Quang Trung

Pop

4



PUSH

Thao tác thêm - Push vào Stack

Top

GV. Thiều Quang Trung

5


Thao tác lấy - Pop khỏi stack

Top

POP

GV. Thiều Quang Trung

6


Ví dụ thêm và xóa phần tử trong stack
Cần nhập 4 số vào
Nhập 1
Ban đầu

1
Lấy ra => 3


Lấy ra => 7

3
7

7

5
1

5
1

Nhập 5

5
1

Lấy ra => 5

5
1
GV. Thiều Quang Trung

Nhập 7

Nhập 3

7


3
7

5
1

5
1

Lấy ra => 1

Stack đã rỗng
Ngừng

1
7


Cách xây dựng Stack
Mảng 1 chiều
Danh sách liên kết
▪ Viết chương trình dễ ▪ Phức tạp khi triển khai
dàng, nhanh chóng
chương trình
▪ Bị hạn chế do số lượng ▪ Không bị cố định về số
phần tử cố định
phần tử, phụ thuộc vào
bộ nhớ
▪ Tốn chi phí tái cấp phát

và sao chép vùng nhớ
nếu sử dụng mảng
động
GV. Thiều Quang Trung

8


Stack – Sử dụng mảng
Top

6
3
9

Stack

9

3

6

0

1

2

3


4

5

GV. Thiều Quang Trung

6

7

8

9

9


Stack số nguyên – Sử dụng mảng
struct ttStack

{
int* StkArray; // mảng chứa các phần tử
int StkMax; // số phần tử tối đa

int StkTop; // vị trí đỉnh Stack
};
typedef struct ttStack STACK;
GV. Thiều Quang Trung


10


Stack số nguyên – Sử dụng mảng
bool InitStack(STACK& s, int MaxItems)
{
s.StkArray = new int[MaxItems];
if (s.StkArray == NULL)
return false;
s.StkMax = MaxItems;
s.StkTop = -1;
return true;
}
GV. Thiều Quang Trung

11


Stack số nguyên – Sử dụng mảng
bool IsEmpty(const STACK &s)
{
if (s.StkTop==-1)
return true;
return false;
}

GV. Thiều Quang Trung

12



Stack số nguyên – Sử dụng mảng
bool IsFull(const STACK &s)
{
if (s.StkTop==s.StkMax-1)
return true;
return false;
}

GV. Thiều Quang Trung

13


Stack số nguyên – Sử dụng mảng
bool Push (STACK &s, int newitem)
{
if (IsFull(s))
return false;
s.StkTop++;
s.StkArray[s.StkTop] = newitem;
return true;
}
GV. Thiều Quang Trung

14


Stack số nguyên – Sử dụng mảng
bool Pop(STACK &s, int &outitem)

{
if (IsEmpty(s))
return false;
outitem = s.StkArray[s.StkTop];
s.StkTop--;
return true;
}
GV. Thiều Quang Trung

15


Bài tập
• Viết hàm nhập và xuất Stack số nguyên
• Khai báo cấu trúc và viết hàm tạo Stack từ
chuỗi ký tự str (mỗi phần tử Stack là ký tự)
• Khai báo cấu trúc và viết hàm tạo Stack từ
chuỗi ký tự str (mỗi phần tử Stack là một từ
- từ cách nhau bởi khoảng trắng)

GV. Thiều Quang Trung

16


Stack – Ví dụ ứng dụng
• Kiểm tra sự tương ứng của các cặp ngoặc
đơn trong một biểu thức
?


?

• ((A+B)/C
( A + B ) / C)
• Đảo ngược một chuỗi ký tự
• Kinh tế Đối ngoại ➔ iạogn iốĐ ết hniK

GV. Thiều Quang Trung

17


Stack – Sử dụng DSLK
StkCnt

StkTop

N
7

7
9

Data

Link

9




Data

Link



4
4
Data
GV. Thiều Quang Trung

Link
18


Stack – Sử dụng DSLK
• Cấu tạo đầu stack
StkCnt

StkTop

N

• Cấu tạo một phần tử

Data

stack
StkCnt <integer>

StkTop <node pointer>
end stack
node
Data
Link
end node

<datatype>
<node pointer>

Link

GV. Thiều Quang Trung

19


Stack số nguyên – Sử dụng DSLK
typedef struct tagSTACK_NODE
{
int Data;
tagSTACK_NODE *pNext;
} STACK_NODE;
typedef struct STACK
{
int StkCount;
STACK_NODE *StkTop;
};
GV. Thiều Quang Trung


20


Stack – Sử dụng DSLK
• VD: Thực hiện một số thao tác trên stack
STACK s;
InitStack(s);
StkCnt StkTop
N
Push(s, 7);
Push(s, 4);
47
Data
Pop(s, x); // x = ?

GV. Thiều Quang Trung

Link

21


Stack số nguyên – Sử dụng DSLK
void InitStack(STACK &s)
{
s.StkTop = NULL;
s.StkCount = 0;
}

GV. Thiều Quang Trung


22


Stack số nguyên – Sử dụng DSLK
bool IsEmpty(const STACK &s)
{
if (s.StkTop == NULL)
return true;
return false;
}

GV. Thiều Quang Trung

23


Stack số nguyên – Sử dụng DSLK
bool IsFull (const STACK s)
{
STACK_NODE* temp = new STACK_NODE;
if (temp == NULL)
return true;
delete temp;
return false;
}

GV. Thiều Quang Trung

24



Stack số nguyên – Sử dụng DSLK
bool Push(STACK &s, int newitem)
{
StkCnt StkTop
if (IsFull(s))
N
return false;
STACK_NODE *pNew = new STACK_NODE;
pNew->Data = newitem;
pNew->pNext = s.StkTop;
s.StkTop = pNew;
s.StkCount++;
return true;
}
GV. Thiều Quang Trung

47
Data

Link

25


×