Stack, sử dụng mảngThao tác Push: thêm 1 phần tử vào đỉnh Stack int PushStack &s, int newItem {... Stack, sử dụng danh sách liên kết khai báo cấu trúc 1 phần tử trong stack Typedef stru
Trang 1Mô tả kiểu dữ liệu trừu tượng stack
Trang 4Mô tả
Có hai lỗi liên quan với kiểu dữ liệu trừu tượng này:
pop một stack rỗng hoặc
Chưa định nghĩa vị trí top của một stack rỗng
top
Trang 5Hiện thực
thời gian O(1) tại cuối dãy
push và pop ở cuối dãy:
top
Trang 62 Thông báo lỗi,
3 Bỏ qua phần tử đang push vào Stack,
4 Cho tiến trình ngưng lại chờ đến khi gặp thao
tác pop ra từ Stack
Trang 7int *arrStack; // mảng chứa các phần tử
int max; // số phần tử tối đa
int top; // vị trí đỉnh Stack
}
Trang 8Stack, sử dụng mảng
Thao tác khởi tạo Stack rỗng
int Init(Stack &s, int maxItems)
Trang 9Stack, sử dụng mảng
int IsEmpty(const Stack &s)
Trang 10Stack, sử dụng mảng
int IsFull(const Stack &s)
{
if (s.top == s.max -1)
đầy
}
Trang 11Stack, sử dụng mảng
Thao tác Push: thêm 1 phần tử vào đỉnh Stack
int Push(Stack &s, int newItem) {
Trang 12Stack, sử dụng mảng
Thao tác Pop: lấy ra 1 phần tử từ đỉnh Stack
int Pop(Stack &s, int &outItem) {
Trang 13Stack, sử dụng danh sách liên kết
khai báo cấu trúc 1 phần tử trong stack
Typedef struct tagSTACK_NODE
{
tagSTACK_NODE *next;
} S_Node;
khai báo cấu trúc stack
Typedef S_Node *SList;
Trang 14Stack, sử dụng danh sách liên kết
Thao tác khởi tạo Stack rỗng
void InitStack(SList s)
{
s = NULL;
}
Trang 15Stack, sử dụng danh sách liên kết
Trang 16Stack, sử dụng danh sách liên kết
Thao tác Push: thêm 1 phần tử vào đỉnh Stack
int Push(SList s, int newItem)
{
SList pNew = new S_Node;
s = pNew;
}
Trang 17Stack, sử dụng danh sách liên kết
Thao tác Pop: lấy ra 1 phần tử từ đỉnh Stack
int Pop(SList s, int &outItem)
Trang 18 phân tích cú pháp (parsing code):
Kiểm tra các dấu ngoặc đơn
Tổ chức lưu vết các quá trình tìm kiếm theo
chiều sâu và quay lui
Xử lý các thao tác undo/redo
Cú pháp nghịch đảo Balan
Trang 19 Khi các bài toán nhỏ hơn đã được giải quyết,
điều ta quan tâm là trở về bài toán ban đầu
Trang 20 Đối sánh các tag trong XHTML
Đối sánh các dấu ngoặc
đơn ( )
vuông, và [ ]
trong C++
Trang 21<head><title> Hello </title></head>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
Phân tích cú pháp trong XHTML
Trang 22Phân tích cú pháp trong
XHTML
Nesting chỉ ra rằng bất kỳ tag đóng nào cũng phải
Đọc trang tài liệu một cách tuyến tính.
Đặt tag mở vào stack
Khi gặp một tag đóng, kiểm tra nó có đối sánh với tag đang ở đỉnh stack ?
Trang 23Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html>
Trang 24Phân tích cú pháp trong XHTML
<html>
<head> <title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html> <head>
Trang 25Phân tích cú pháp trong XHTML
<html>
<head> <title>Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html> <head> <title>
Trang 26Phân tích cú pháp trong XHTML
<html>
<head><title> Hello</title> </h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html> <head> <title>
Trang 27Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title> </h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html> <head>
Trang 28Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<i> browswer </i> </p></body>
</html>
<html> <body>
Trang 29Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body> <p>This appears in the
<i> browswer </i> </p></body>
</html>
<html> <body> <p>
Trang 30Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i>browswer </i> </p></body>
</html>
<html> <body> <p> <i>
Trang 31Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer</i> </p></body>
</html>
<html> <body> <p> <i>
Trang 32Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p> </body>
</html>
<html> <body> <p>
Trang 33Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p> </body>
</html>
<html> <body>
Trang 34Phân tích cú pháp trong XHTML
<html>
<head><title> Hello </title></h ead>
<body><p> This appears in the
<i> browswer </i> </p></body>
</html>
<html>
Trang 35Phân tích cú pháp trong
XHTML
Ta đã kết thúc việc phân tích cú pháp, và stack đã
rỗng
Những lỗi có thể xảy ra:
Tag đóng không phù hợp với tag mở trên đỉnh stack
Còn tag đóng khi stack rỗng
stack không rỗng khi đã ở cuối tài liệu
Trang 36Phân tích cú pháp trong C++
Giống như tag mở và tag đóng, các dấu ngoặc trong C++ cũng được lồng nhau một cách tương tự:
int initialize ( int * array, int n )
Trang 38Lời gọi hàm
đã trình bày trước đây:
Ta viết một hàm để giải quyết bài toán
Hàm này cần phải giải những bài toán con nhỏ hơn, vì vậy nó phải gọi hàm khác
Một khi hàm con đã thực hiện xong, nó trở về nơi đã gọi nó
Trang 39Cú pháp nghịch đảo Balan
dạng sau:
(3 + 4) × 5 – 6
(3 + 4) × 5 – 6 = 29
3 + 4 × 5 – 6 = 17
3 + 4 × (5 – 6) = –1 (3 + 4) × (5 – 6) = –7
Trang 42Cú pháp nghịch đảo Balan
Không có sự tối nghĩa, và cũng không cần các dấu ngoặc
Tương tự với tiến trình tính toán trên máy tính:
Các toán hạng được load vào thanh ghi trước khi thực hiện phép toán
Trang 53Cú pháp nghịch đảo Balan
1 2 3 + 4 5 6 × – 7 × + – 8 9 × +
–2651
Trang 62Cú pháp nghịch đảo Balan
1 2 3 + 4 5 6 × – 7 × + – 8 9 × +
có kết quả là giá trị tại đỉnh stack: 250
((1 – ((2 + 3) + ((4 – (5 × 6)) × 7))) + (8 × 9))
1 – (2 + 3 + (4 – 5 × 6) × 7) + 8 × 9