sinh viên thực hiện
Post on 29-Jan-2016
63 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
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;};
MÔ TẢ
Info n
pnext
Top
Info 2
pnext
Info 1
pnextNULL
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ỗngreturn 0; //Stack khác rỗng}
Thêm phần tử vào stack
void Push(List&S , Data x)void Push(List&S , Data x){{
Node *Node * pNew pNew=new Node;=new Node;if ( if ( pNew==NULLpNew==NULL){){cout<<“không đủ bộ nhớ”;cout<<“không đủ bộ nhớ”;
returnreturn;;}} pNew pNew ->info=x;->info=x; pNew pNew ->pnext=S.Top;->pnext=S.Top;S.Top=S.Top= pNew pNew;;
}}
Thêm phần tử
TopInfo n
pnext
Info 1pnext
NULL
X
pnext
New_eleTop
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;
}
Trích phần tử ở đỉnh
Top Info n -1
pnext
Info 1
pnextNULL
Info n
pnextTop
Xem phần tử ở đỉnh stack
Data Top(List &S){
if (Empty(S)) return NULL;
return (S.Top->info);}
QUEUE- HÀNG ĐỢI
Đị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ôngAdd_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;};
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
A B Y NULL
Tail
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);}
Add_Queue
A V w
Head
NULL
Tail Tail
X
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;
}
Get_Queue
A
Head
NULLC X
TailHead
Ú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ậtInput: 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ậtTa 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);
top related