300 likes | 475 Views
Sinh viên thực hiện. HOÀNG TƯỜNG MSSV:K30.101.110 NGUYỄN THANH TÙNG MSSV:K30.101.107. STACK &QUEUE. STACK _NGĂN XẾP. Định nghĩa. STACK là vật chứa các đối tượng làm việc theo cơ chế LIFO(Last In First Out),nghĩa là đối tượng được bỏ vào stack sau cùng sẽ được lấy ra trước.
E N D
Sinh viên thực hiện • HOÀNG TƯỜNG • MSSV:K30.101.110 • NGUYỄN THANH TÙNG • MSSV:K30.101.107
Định nghĩa STACK là vật chứa các đối tượng làm việc theo cơ chế LIFO(Last In First Out),nghĩa là đối tượng được bỏ vào stack sau cùng sẽ được lấy ra trước
Các tác vụ chính • Init :khởi tạo stack. • Empty :kiểm tra stack rỗng hay không. • Push :thêm phần tử vào stack. • Pop: trích phần tử của stack. • Top :xem thông tin của phần tử ở đỉnh stack, nhưng không hủy phần tử đó.
Dùng danh sách liên kết để biểu diễn stack • struct Node • { • int info; • Node *pnext; • }; • struct List • { • Node* Top; • };
Info n pnext Top Info 2 pnext Info 1 pnext NULL MÔ TẢ
Khởi tạo • Cho Top trỏ đến NULL • void Init(List&S) • { • S.Top=NULL; • };
Kiểm tra rỗng • int Empty(List& S) • { • if(S.Top==NULL) return 1;//Stack rỗng • return 0; //Stack khác rỗng • }
Thêm phần tử vào stack • void Push(List&S , Data x) • { • Node * pNew=new Node; • if ( pNew==NULL){ • cout<<“khôngđủbộnhớ”; return; • } • pNew ->info=x; • pNew ->pnext=S.Top; • S.Top= pNew; • }
X pnext Top Top New_ele Info n pnext Info 1 pnext NULL Thêm phần tử
Trích phần tử ở đỉnh stack • int Pop(List& S) • { • if(Empty(S)) { • cout<<“Danh sách rỗng”<<endl; • return MAXINT;} • Node*p=S.Top; • S.Top=p->Pnext; • int x=p->info; • delete p; • return x; • }
Info n pnext Top Top Info n -1 pnext Info 1 pnext Trích phần tử ở đỉnh NULL
Xem phần tử ở đỉnh stack • Data Top(List &S) • { • if (Empty(S)) return NULL; • return (S.Top->info); • }
Định nghĩa: QUEUE là một vật chứa các đối tượng làm việc theo cơ chế FIFO(First In First Out),nghĩa là các đối tượng được nhập vào trước sẽ được lấy ra trước.
Các tác vụ chính: • Init :khởi tạo Queue • Empty :kiểm tra Queue có rỗng không • Add_Queue :thêm một phần tử vào cuối Queue • Get_Queue :trích phần tử ở đầu Queue
Dùng danh sách liên kết để biểu diễn hàng đợi . • struct Node • { data info; • Node *next; • }; • struct List • { Node *Head; • Node*Tail; • };
Tail B Y A NULL Mô tả • Trong danh sách liên kết ta dùng hai biến con trỏ kiểu Node là Head và Tail để trỏ vào phần tử ở đầu Queue và cuối Queue Head
Khởi tạo Queue : • Cho con trỏ Head và Tail trỏ đến NULL • void Init(List&Q) • { • Q.Head= Q.Tail=NULL; • }
Kiểm tra Queue rỗng • int Empty(List&Q) • { • if (Q.Head==NULL) • return 1;// Queue rỗng • return 0;//Queue khác rỗng • }
Thêm một phần tử vào Queue: • Ta sử dụng : các hàm GetNode,và hàm AddTail của danh sách liên kết • void Add_Queue(List&Q,data x) • { • Node *p; • p=GetNode(x); • AddTail(Q,p); • }
Tail Tail Head A V w X Add_Queue NULL
Trích phần tử của Queue : • Ta sử dụng hàm RemoveHead của danh sách liên kết • data Get_Queue(List&Q); • { • Data x; • x=RemoveHead(Q); • return x; • }
Tail Head Head X A C Get_Queue NULL
Úng dụng của Stack & Queue • Đổi từ biểu thức trung tố sang biểu thức hậu tố • Tính giá trị của biểu thức hậu tố • Tìm chu trình Euler trong đồ thị Euler
Đổi từ trung tố sang hậu tố Giải thuật Input: Queue infix chứa biểu thức dạng trung tố Output: Queue posfix chứa biểu thức dạng hậu tố
Giải thuật Ta sử dụng stack S để chứa tóan tử và ‘(‘ trong quá trình xứ lí Ta gán độ ưu tiên của tóan tử *, / là 1;của +,- là 0; while(!empty(infix)) { kt=get_queue(infix); nếu kt là tóan hạng : bỏ vào queue posfixt; nếu kt=’(‘ :bỏ vào stack S; nếu kt=‘)’ : lần lượt lấy các tóan tử top(S) bỏ vào queue postfix cho đến khi gặp ‘(‘;sau đó lấy ‘(‘ ra khỏi stack nếu kt là toán tử {+,-,*,/ } : trong khi độ ưu tiên của kt <=độ ưu tiên của top(S) thì lấy top(S) bỏ vào queue posfix sau đó bỏ kt vào stack S } while(!empty(S)) {lấy top(S) bỏ vào queue posfix }
Tính giá trị biểu thức hậu tố Input: Queue posfix chứa biểu thức dạng hậu tố Output: giá trị của biểu thức hậu tố
Giải thuật Ta sử dụng thêm stack S làm trung gian để tinh tóan while(!empty(posfix) { kt=get_queue(posfix); Nếu kt là tóan hạng bỏ kt vào stack S; Nếu kt là tóan tử lần lượt lấy ở đỉnh stack hai tóan hạng,lấy phần tử thứ hai thực hiện phép tính với phần tử thứ nhất ; lấy kết quả bỏ vào stack S; } Kết quả biểu thức bằng pop(S);