SlideShare a Scribd company logo
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 2: Stack
Mô tả stack Một stack là một cấu trúc dữ liệu mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh – top của stack).  Là một dạng vào sau ra trước – LIFO (Last In First Out)
Ví dụ về stack Stack rỗng: Đẩy (push) Q vào: Đẩy A vào: Lấy (pop) ra một => được A: Lấy ra một => được Q và stack rỗng: Q Q A Q A Q
Ứng dụng: Đảo ngược danh sách Yêu cầu: Đảo ngược một danh sách nhập vào Giải thuật: 1.  Lặp lại n lần 1.1.  Nhập vào một giá trị 1.2.  Đẩy nó vào stack 2.  Lặp khi stack chưa rỗng 2.1.  Lấy một giá trị từ stack 2.2.  In ra
Đảo ngược danh sách – Ví dụ 1 5 7 3 3 7 5 1 Cần nhập 4 số vào Ban đầu Nhập 1 Nhập 5 1 Nhập 7 1 5 Nhập 3 1 5 7 Lấy ra => 3 1 5 7 Lấy ra => 7 1 5 Lấy ra => 5 1 Lấy ra => 1 Stack đã rỗng Ngừng
Đảo ngược danh sách – Mã C++ #include <stack> using   namespace  std; int  main( ) { int  n; double  item; stack< double > numbers; cout << &quot;Bao nhieu so nhap vao? &quot; cin >> n; for  ( int  i = 0; i < n; i++) { cin >> item; numbers.push(item); } while  (!numbers.empty( )) { cout << numbers.top( ) << &quot; &quot;; numbers.pop( ); } } sử dụng STL (Standard Template Library) khai báo một stack có kiểu dữ liệu  của các phân tử bên trong là double đẩy một số vào trong stack kiểm tra xem stack có khác rỗng không lấy giá trị trên đỉnh của stack ra, stack không đổi lấy giá trị trên đỉnh của stack ra khỏi stack, đỉnh của stack bây giờ là giá trị kế tiếp
Kiểu trừu tượng (abstract data type) ĐN1: Một kiểu (type) một tập hợp mỗi thành phần của tập hợp này là các giá trị (value) Ví dụ: int, float, char là các kiểu cơ bản ĐN2: Một dãy của kiểu T có chiều dài bằng 0 là rỗng có chiều dài n (n>=1): bộ thứ tự (Sn-1, t) Sn-1: dãy có chiều dài n-1 thuộc kiểu T t là một giá trị thuộc kiểu T.
Stack trừu tượng Một stack kiểu T: Một dãy hữu hạn kiểu T Một số tác vụ: 1. Khởi tạo stack rỗng ( create ) 2. Kiểm tra rỗng ( empty ) 3. Đẩy một giá trị vào trên đỉnh của stack ( push ) 4. Bỏ giá trị đang có trên đỉnh của stack ( pop ) 5. Lấy giá trị trên đỉnh của stack, stack không đổi ( top )
Thiết kế stack enum  Error_code  {fail, success, overflow, underflow}; template  < class  Entry> class  Stack { public : Stack(); //constructor bool  empty()  const ; //kiểm tra rỗng Error_code push( const  Entry &item); //đẩy item vào Error_code pop(); //bỏ phần tử trên đỉnh Error_code top(Entry &item); //lấy giá trị trên đỉnh //khai báo một số phương thức cần thiết khác private : //khai báo dữ liệu và hàm phụ trợ chỗ này };
Thiết kế các phương thức template  < class  Entry> bool  Stack<Entry>::empty()  const ; Pre : Không có Post : Trả về giá trị  true  nếu stack hiện tại là rỗng, ngược lại thì trả về  false template  < class  Entry> Error_code  Stack<Entry>::push( const  Entry &item); Pre : Không có Post : Nếu stack hiện tại không đầy, item sẽ được thêm vào đỉnh của stack.  Ngược lại trả về giá trị  overflow  của kiểu Error_code và stack không đổi. template  < class  Entry> Error_code  Stack<Entry>::pop()  const ; Pre : Không có Post : Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ bị hủy bỏ.  Ngược lại trả về giá trị  underflow  của kiểu Error_code và stack không đổi. template  < class  Entry> Error_code  Stack<Entry>::top(Entry &item)  const ; Pre : Không có Post : Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ được chép vào tham  biến item. Ngược lại trả về giá trị  fail  của kiểu Error_code.
Hiện thực stack liên tục
Khai báo stack liên tục const   int   maxstack = 10; //small number for testing template  < class  Entry> class  Stack { public : Stack( ); bool  empty( )  const ; Error_code pop( ); Error_code top(Entry &item)  const ; Error_code push(const Entry &item); private : int  count; Entry entry[maxstack]; };
Đẩy một phần tử vào stack Giải thuật: 1.  Nếu còn chỗ trống trong stack 1.1.  Tăng vị trí đỉnh lên 1 1.2.  Chứa giá trị vào vị trí đỉnh của stack 1.3.  Tăng số phần tử lên 1 7 count=2 count=3 top 1 5
Bỏ phần tử trên đỉnh stack Giải thuật: 1.  Nếu còn phần tử trong stack 1.1.  Giảm vị trí đỉnh đi 1 1.2.  Giảm số phần tử đi 1 count=3 count=2 top 1 5 7
Thêm/Bỏ phần tử - Mã C++ template  < class  Entry> Error_code Stack<Entry>:: push( const  Entry &item) { if  (count >= maxstack) return  overflow; else entry[count++] = item; return  success; } template  < class  Entry> Error_code Stack<Entry>:: pop() { if  (count == 0) return  underflow; else count--; return  success; }
Lấy giá trị trên đỉnh stack Giải thuật: 1.  Nếu còn phần tử trong stack 1.1.  Trả về giá trị tại vị trí đỉnh Mã C++: template  < class  Entry> Error_code Stack<Entry>:: top(Entry &item) { if  (count == 0) return  underflow; else item = entry[count - 1]; return  success; }
Reverse Polish Calculator Mô tả bài toán: Các toán hạng được đọc vào trước và đẩy vào stack Khi đọc vào toán tử, lấy hai toán hạng ra từ stack, tính toán với toán tử này, rồi đẩy kết quả vào stack Thiết kế phần mềm: Cần một stack để chứa toán hạng Cần hàm get_command để nhận lệnh từ người dùng Cần hàm do_command để thực hiện lệnh
Reverse Polish Calculator  – Thiết kế chức năng Tập lệnh: ‘ ?’: đọc một giá trị rồi đẩy vào stack Toán tử ‘+’, ‘-’, ‘*’, ‘/’: lấy 2 giá trị trong stack, tính toán và đẩy kết quả vào stack Toán tử ‘=’: in đỉnh của stack ra ‘ q’: kết thúc chương trình
Reverse Polish Calculator – Ví dụ Tính toán biểu thức:  3  5  +  2  *  = 3 5 Toán tử + Lấy ra 5 và 3 Tính 3 + 5 => 8 3 5 8 Toán tử * Lấy ra 2 và 8 Tính 8 * 2 => 16 8 16 2 2 16 Ban đầu Toán tử ? Nhập vào 3 Toán tử ? Nhập vào 5 3 Đẩy 8 vào Đẩy vào 16 Toán tử = In ra 16 16 Toán tử ? Nhập vào 2 8
Reverse Polish Calculator – Hàm get_command char  get command( ) { char  command ; bool  waiting =  true; cout << &quot;Select command and press < Enter > :&quot; ; while  (waiting) { cin >> command ; command = tolower(command) ; if  (command == ‘?’ || command == ‘=‘ || command == ‘+’ || command == ‘−’|| command == ‘*’ || command == ‘/’ || command == ‘q’) waiting =  false; else  { cout << &quot;Please enter a valid command:&quot; << endl << &quot;[?]push to stack [=]print top&quot; <<endl << &quot;[+] [−] [*] [/] are arithmetic operations&quot; << endl << &quot;[Q]uit.&quot; << endl ; } } return  command ; }
Reverse Polish Calculator –  Giải thuật tính toán với toán tử Algorithm  Op_process Input : toán tử  op , stack chứa các toán hạng Output : stack chứa các toán hạng sau khi tính xong toán tử  op 1.  Nếu stack không rỗng 1.1.  Lấy đỉnh stack ra thành p 1.2.  Bỏ phần tử trên đỉnh stack 1.3.  Nếu stack rỗng 1.3.1.  Đẩy p ngược lại 1.3.2.  Báo lỗi và thoát 1.4.  Lấy đỉnh stack ra thành q 1.5.  Bỏ phần tử trên đỉnh stack 1.6.  Tính toán (q  op  p) 1.7.  Đẩy kết quả vào stack End  Op_process
Reverse Polish Calculator –  Mã C++ cho toán tử cộng if  (numbers.top(p) == underflow) cout << &quot;Stack rỗng&quot;; else  { numbers.pop( ); if  (numbers.top(q) == underflow) { cout << &quot;Stack chỉ có 1 trị”; numbers.push(p); } else  { numbers.pop( ); if  (numbers.push(q + p) == overflow) cout << &quot;Stack đầy”; } }
Reverse Polish Calculator –  Chương trình chính #include &quot;stack.cpp&quot; //prototype void  introduction( ); void  instructions( ); char  get_command( ); bool  do_command( char  command, Stack< double > &numbers); int  main( ) { Stack< double > stored_numbers; introduction( );  instructions( ); while  (do_command(get_command( ), stored_numbers)); } //implementation …
Reverse Polish Calculator – Hàm do_command bool  do_command( char  command ,  Stack &numbers) { double  p ,  q ; switch  (command) { case  '?’ : cout << &quot;Enter a real number: &quot; << flush ;  cin >> p ; if  (numbers . push(p) == overflow) cout << &quot;Warning: Stack full, lost number&quot; << endl ; break; case  '=‘ : if  (numbers . top(p) == underflow) cout << &quot;Stack empty&quot; << endl ; else  cout << p << endl ; break; //  Add options for further user commands. case  ‘q’ :  cout << &quot;Calculation finished.\n&quot; ; return false; } return true; }

More Related Content

PPT
Ctdl C04
PPT
Ctdl C05
PPT
Ctdl C01
PDF
Huong dan su dung va debug voi dev c++
PPT
Bai 11 kieu mang (tiet 1)
PDF
Debug trong c
PPT
Ctdl C03
DOCX
bai tap cau truc du lieu ptit
Ctdl C04
Ctdl C05
Ctdl C01
Huong dan su dung va debug voi dev c++
Bai 11 kieu mang (tiet 1)
Debug trong c
Ctdl C03
bai tap cau truc du lieu ptit

What's hot (18)

PPT
Kiểu Mảng 1 chiều
PPT
Nmlt c06 ham
PDF
Control structure in C
PDF
Basic C programming
PDF
Tut5 solution
PDF
PPT
Session 09
PDF
Mot so ham do hoa trong c c++
PDF
C đến C++ phần 1
PPTX
Chuong trinh con
PDF
Ktlt lab full
PDF
Tut6 solution
PPTX
PPTX
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
PPT
Nmlt c09 chuoi_kytu
DOCX
Hướng dẫn làm bt về chuỗi.doc
Kiểu Mảng 1 chiều
Nmlt c06 ham
Control structure in C
Basic C programming
Tut5 solution
Session 09
Mot so ham do hoa trong c c++
C đến C++ phần 1
Chuong trinh con
Ktlt lab full
Tut6 solution
Bài 18. Ví dụ về cách viết và sử dụng chương trình con.
Nmlt c09 chuoi_kytu
Hướng dẫn làm bt về chuỗi.doc
Ad

Viewers also liked (20)

PDF
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
PPT
Wireless
PDF
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
PDF
System hacking_Athena
PPT
Ctdl C09
PPT
Ctdl C11
PPT
Ctdl C10
PPT
Ctdl C08
PDF
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
PPT
Ctdl C06
PPT
Gioi Thieu
PPT
Ctdl C07
PPTX
man in the middle
PDF
Bài 4: Bảo mật máy chủ, ứng dụng, dữ liệu và mạng - Giáo trình FPT
DOCX
tìm hiểu các lỗ hổng bảo mật
PDF
Chương 6 Bảo mật - Giáo trình FPT
PPTX
Man In The Middle - Hacking Illustrated
PDF
Bài 7: Xác thực và quản lý tài khoản - Giáo trình FPT
PDF
Bài 5: Quản trị một mạng an toàn và Bảo mật các mạng không dây - Giáo trình FPT
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
Wireless
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
System hacking_Athena
Ctdl C09
Ctdl C11
Ctdl C10
Ctdl C08
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
Ctdl C06
Gioi Thieu
Ctdl C07
man in the middle
Bài 4: Bảo mật máy chủ, ứng dụng, dữ liệu và mạng - Giáo trình FPT
tìm hiểu các lỗ hổng bảo mật
Chương 6 Bảo mật - Giáo trình FPT
Man In The Middle - Hacking Illustrated
Bài 7: Xác thực và quản lý tài khoản - Giáo trình FPT
Bài 5: Quản trị một mạng an toàn và Bảo mật các mạng không dây - Giáo trình FPT
Ad

Similar to Ctdl C02 (20)

PDF
C6 stack queue
PPTX
Stack &amp; queue
PDF
Bai10 stack queue
PPTX
Bai giang stack c++
PDF
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
PPT
bjjjkkjhjkhkjhjhkjgkjghfghjgklhukhuk.ppt
PDF
02 stack queue
PPTX
Giao trinh Stack va Queue trong DSA.pptx
PPTX
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
PPT
Session 09
PPT
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
PPT
C3 stack queue
PDF
Cpl test1%20key
PPT
4 Pointer String Struct
PPT
Nmlt C06 Ham
PPT
Các ví dụ về cách viết và sử dụng chương trình con
PPT
Php Csdlweb06
DOC
Bài tập CTDL và GT 12
PDF
Lec3. Ham.pdf
DOC
Ontap ltc
C6 stack queue
Stack &amp; queue
Bai10 stack queue
Bai giang stack c++
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
bjjjkkjhjkhkjhjhkjgkjghfghjgklhukhuk.ppt
02 stack queue
Giao trinh Stack va Queue trong DSA.pptx
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
Session 09
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
C3 stack queue
Cpl test1%20key
4 Pointer String Struct
Nmlt C06 Ham
Các ví dụ về cách viết và sử dụng chương trình con
Php Csdlweb06
Bài tập CTDL và GT 12
Lec3. Ham.pdf
Ontap ltc

Recently uploaded (20)

PDF
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
PDF
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
PDF
SÁNG KIẾN “MỘT SỐ KINH NGHIỆM HƯỚNG DẪN HỌC SINH THAM GIA CUỘC THI KHOA HỌC K...
PDF
SÁNG KIẾN THIẾT KẾ MÔ HÌNH HỆ SINH THÁI HƯỚNG NGHIỆP CHO HỌC SINH THPT TRONG ...
PDF
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
BỘ TÀI LIỆU CHINH PHỤC ĐỈNH CAO TIẾNG ANH NĂM 2026 CHUYÊN ĐỀ ÔN HỌC SINH GIỎI...
PPTX
Chương3,Buổi7,8,9,10(Buổi10 kiểmtraL2).pptx
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
bo-trac-nghiem-toan-11 dành cho cả năm học
PPTX
slide chương 2 excel cơ bản...........,,
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 12 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
PPTX
CASE LÂM SÀNG MỤN TRỨNG CÁd (final, BS Vân Thanh)-SV tai lop.pptx
PDF
bai giang an toan thong tin ke toan nam 2020
PPTX
2. tràn khí màng phổi bệnh học nộii.pptx
DOCX
ôn tập thơ 4 chữ, 5 chữ ngữ văn 7 ctst sgk
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PPTX
Bài 9.4 TUYẾN SINH DỤC NAM VÀ NU CẤU TẠO VÀ CHỨC NĂNG
DOCX
Cao Thuy Linh-San pham cuoi khoa.- bồi dưỡng thường xuyêndocx
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
SÁNG KIẾN “MỘT SỐ KINH NGHIỆM HƯỚNG DẪN HỌC SINH THAM GIA CUỘC THI KHOA HỌC K...
SÁNG KIẾN THIẾT KẾ MÔ HÌNH HỆ SINH THÁI HƯỚNG NGHIỆP CHO HỌC SINH THPT TRONG ...
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
BỘ TÀI LIỆU CHINH PHỤC ĐỈNH CAO TIẾNG ANH NĂM 2026 CHUYÊN ĐỀ ÔN HỌC SINH GIỎI...
Chương3,Buổi7,8,9,10(Buổi10 kiểmtraL2).pptx
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
bo-trac-nghiem-toan-11 dành cho cả năm học
slide chương 2 excel cơ bản...........,,
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 12 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
CASE LÂM SÀNG MỤN TRỨNG CÁd (final, BS Vân Thanh)-SV tai lop.pptx
bai giang an toan thong tin ke toan nam 2020
2. tràn khí màng phổi bệnh học nộii.pptx
ôn tập thơ 4 chữ, 5 chữ ngữ văn 7 ctst sgk
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
Bài 9.4 TUYẾN SINH DỤC NAM VÀ NU CẤU TẠO VÀ CHỨC NĂNG
Cao Thuy Linh-San pham cuoi khoa.- bồi dưỡng thường xuyêndocx

Ctdl C02

  • 1. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 2: Stack
  • 2. Mô tả stack Một stack là một cấu trúc dữ liệu mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh – top của stack). Là một dạng vào sau ra trước – LIFO (Last In First Out)
  • 3. Ví dụ về stack Stack rỗng: Đẩy (push) Q vào: Đẩy A vào: Lấy (pop) ra một => được A: Lấy ra một => được Q và stack rỗng: Q Q A Q A Q
  • 4. Ứng dụng: Đảo ngược danh sách Yêu cầu: Đảo ngược một danh sách nhập vào Giải thuật: 1. Lặp lại n lần 1.1. Nhập vào một giá trị 1.2. Đẩy nó vào stack 2. Lặp khi stack chưa rỗng 2.1. Lấy một giá trị từ stack 2.2. In ra
  • 5. Đảo ngược danh sách – Ví dụ 1 5 7 3 3 7 5 1 Cần nhập 4 số vào Ban đầu Nhập 1 Nhập 5 1 Nhập 7 1 5 Nhập 3 1 5 7 Lấy ra => 3 1 5 7 Lấy ra => 7 1 5 Lấy ra => 5 1 Lấy ra => 1 Stack đã rỗng Ngừng
  • 6. Đảo ngược danh sách – Mã C++ #include <stack> using namespace std; int main( ) { int n; double item; stack< double > numbers; cout << &quot;Bao nhieu so nhap vao? &quot; cin >> n; for ( int i = 0; i < n; i++) { cin >> item; numbers.push(item); } while (!numbers.empty( )) { cout << numbers.top( ) << &quot; &quot;; numbers.pop( ); } } sử dụng STL (Standard Template Library) khai báo một stack có kiểu dữ liệu của các phân tử bên trong là double đẩy một số vào trong stack kiểm tra xem stack có khác rỗng không lấy giá trị trên đỉnh của stack ra, stack không đổi lấy giá trị trên đỉnh của stack ra khỏi stack, đỉnh của stack bây giờ là giá trị kế tiếp
  • 7. Kiểu trừu tượng (abstract data type) ĐN1: Một kiểu (type) một tập hợp mỗi thành phần của tập hợp này là các giá trị (value) Ví dụ: int, float, char là các kiểu cơ bản ĐN2: Một dãy của kiểu T có chiều dài bằng 0 là rỗng có chiều dài n (n>=1): bộ thứ tự (Sn-1, t) Sn-1: dãy có chiều dài n-1 thuộc kiểu T t là một giá trị thuộc kiểu T.
  • 8. Stack trừu tượng Một stack kiểu T: Một dãy hữu hạn kiểu T Một số tác vụ: 1. Khởi tạo stack rỗng ( create ) 2. Kiểm tra rỗng ( empty ) 3. Đẩy một giá trị vào trên đỉnh của stack ( push ) 4. Bỏ giá trị đang có trên đỉnh của stack ( pop ) 5. Lấy giá trị trên đỉnh của stack, stack không đổi ( top )
  • 9. Thiết kế stack enum Error_code {fail, success, overflow, underflow}; template < class Entry> class Stack { public : Stack(); //constructor bool empty() const ; //kiểm tra rỗng Error_code push( const Entry &item); //đẩy item vào Error_code pop(); //bỏ phần tử trên đỉnh Error_code top(Entry &item); //lấy giá trị trên đỉnh //khai báo một số phương thức cần thiết khác private : //khai báo dữ liệu và hàm phụ trợ chỗ này };
  • 10. Thiết kế các phương thức template < class Entry> bool Stack<Entry>::empty() const ; Pre : Không có Post : Trả về giá trị true nếu stack hiện tại là rỗng, ngược lại thì trả về false template < class Entry> Error_code Stack<Entry>::push( const Entry &item); Pre : Không có Post : Nếu stack hiện tại không đầy, item sẽ được thêm vào đỉnh của stack. Ngược lại trả về giá trị overflow của kiểu Error_code và stack không đổi. template < class Entry> Error_code Stack<Entry>::pop() const ; Pre : Không có Post : Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ bị hủy bỏ. Ngược lại trả về giá trị underflow của kiểu Error_code và stack không đổi. template < class Entry> Error_code Stack<Entry>::top(Entry &item) const ; Pre : Không có Post : Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ được chép vào tham biến item. Ngược lại trả về giá trị fail của kiểu Error_code.
  • 11. Hiện thực stack liên tục
  • 12. Khai báo stack liên tục const int maxstack = 10; //small number for testing template < class Entry> class Stack { public : Stack( ); bool empty( ) const ; Error_code pop( ); Error_code top(Entry &item) const ; Error_code push(const Entry &item); private : int count; Entry entry[maxstack]; };
  • 13. Đẩy một phần tử vào stack Giải thuật: 1. Nếu còn chỗ trống trong stack 1.1. Tăng vị trí đỉnh lên 1 1.2. Chứa giá trị vào vị trí đỉnh của stack 1.3. Tăng số phần tử lên 1 7 count=2 count=3 top 1 5
  • 14. Bỏ phần tử trên đỉnh stack Giải thuật: 1. Nếu còn phần tử trong stack 1.1. Giảm vị trí đỉnh đi 1 1.2. Giảm số phần tử đi 1 count=3 count=2 top 1 5 7
  • 15. Thêm/Bỏ phần tử - Mã C++ template < class Entry> Error_code Stack<Entry>:: push( const Entry &item) { if (count >= maxstack) return overflow; else entry[count++] = item; return success; } template < class Entry> Error_code Stack<Entry>:: pop() { if (count == 0) return underflow; else count--; return success; }
  • 16. Lấy giá trị trên đỉnh stack Giải thuật: 1. Nếu còn phần tử trong stack 1.1. Trả về giá trị tại vị trí đỉnh Mã C++: template < class Entry> Error_code Stack<Entry>:: top(Entry &item) { if (count == 0) return underflow; else item = entry[count - 1]; return success; }
  • 17. Reverse Polish Calculator Mô tả bài toán: Các toán hạng được đọc vào trước và đẩy vào stack Khi đọc vào toán tử, lấy hai toán hạng ra từ stack, tính toán với toán tử này, rồi đẩy kết quả vào stack Thiết kế phần mềm: Cần một stack để chứa toán hạng Cần hàm get_command để nhận lệnh từ người dùng Cần hàm do_command để thực hiện lệnh
  • 18. Reverse Polish Calculator – Thiết kế chức năng Tập lệnh: ‘ ?’: đọc một giá trị rồi đẩy vào stack Toán tử ‘+’, ‘-’, ‘*’, ‘/’: lấy 2 giá trị trong stack, tính toán và đẩy kết quả vào stack Toán tử ‘=’: in đỉnh của stack ra ‘ q’: kết thúc chương trình
  • 19. Reverse Polish Calculator – Ví dụ Tính toán biểu thức: 3 5 + 2 * = 3 5 Toán tử + Lấy ra 5 và 3 Tính 3 + 5 => 8 3 5 8 Toán tử * Lấy ra 2 và 8 Tính 8 * 2 => 16 8 16 2 2 16 Ban đầu Toán tử ? Nhập vào 3 Toán tử ? Nhập vào 5 3 Đẩy 8 vào Đẩy vào 16 Toán tử = In ra 16 16 Toán tử ? Nhập vào 2 8
  • 20. Reverse Polish Calculator – Hàm get_command char get command( ) { char command ; bool waiting = true; cout << &quot;Select command and press < Enter > :&quot; ; while (waiting) { cin >> command ; command = tolower(command) ; if (command == ‘?’ || command == ‘=‘ || command == ‘+’ || command == ‘−’|| command == ‘*’ || command == ‘/’ || command == ‘q’) waiting = false; else { cout << &quot;Please enter a valid command:&quot; << endl << &quot;[?]push to stack [=]print top&quot; <<endl << &quot;[+] [−] [*] [/] are arithmetic operations&quot; << endl << &quot;[Q]uit.&quot; << endl ; } } return command ; }
  • 21. Reverse Polish Calculator – Giải thuật tính toán với toán tử Algorithm Op_process Input : toán tử op , stack chứa các toán hạng Output : stack chứa các toán hạng sau khi tính xong toán tử op 1. Nếu stack không rỗng 1.1. Lấy đỉnh stack ra thành p 1.2. Bỏ phần tử trên đỉnh stack 1.3. Nếu stack rỗng 1.3.1. Đẩy p ngược lại 1.3.2. Báo lỗi và thoát 1.4. Lấy đỉnh stack ra thành q 1.5. Bỏ phần tử trên đỉnh stack 1.6. Tính toán (q op p) 1.7. Đẩy kết quả vào stack End Op_process
  • 22. Reverse Polish Calculator – Mã C++ cho toán tử cộng if (numbers.top(p) == underflow) cout << &quot;Stack rỗng&quot;; else { numbers.pop( ); if (numbers.top(q) == underflow) { cout << &quot;Stack chỉ có 1 trị”; numbers.push(p); } else { numbers.pop( ); if (numbers.push(q + p) == overflow) cout << &quot;Stack đầy”; } }
  • 23. Reverse Polish Calculator – Chương trình chính #include &quot;stack.cpp&quot; //prototype void introduction( ); void instructions( ); char get_command( ); bool do_command( char command, Stack< double > &numbers); int main( ) { Stack< double > stored_numbers; introduction( ); instructions( ); while (do_command(get_command( ), stored_numbers)); } //implementation …
  • 24. Reverse Polish Calculator – Hàm do_command bool do_command( char command , Stack &numbers) { double p , q ; switch (command) { case '?’ : cout << &quot;Enter a real number: &quot; << flush ; cin >> p ; if (numbers . push(p) == overflow) cout << &quot;Warning: Stack full, lost number&quot; << endl ; break; case '=‘ : if (numbers . top(p) == underflow) cout << &quot;Stack empty&quot; << endl ; else cout << p << endl ; break; // Add options for further user commands. case ‘q’ : cout << &quot;Calculation finished.\n&quot; ; return false; } return true; }