Tài liệu Giáo trình cấu trúc dữ liệu và giải thuật_Chương 3: Cấu trúc Stack & Queue pptx

18 788 3
Tài liệu Giáo trình cấu trúc dữ liệu và giải thuật_Chương 3: Cấu trúc Stack & Queue pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Chương CẤU TRÚC STACK & QUEUE GIỚI THIỆU VỀ STACK 1.1 Khái niệm stack Stack xem dạng danh sách đặc biệt tác vụ thêm vào xóa phần tử diễn đầu gọi đỉnh stack Trên stack nút thêm vào sau lại lấy trước nên cấu trúc stack gọi LIFO (Last In First Out) Stack dùng rộng rải để giải vấn đề có chế LIFO, ví dụ trình biên dịch ngơn ngữ lập trình thường dùng stack để kiểm tra cú pháp câu lệnh, để xử lý biểu thức toán học, để xử lý việc gọi chương trình con, xử lý việc gọi hàm đệ qui … Stack thường dùng để chuyển giải thuật đệ qui thành giải thuật khơng đệ qui Có hai tác vụ stack tác vụ push dùng để thêm phần tử vào đỉnh stack tác vụ pop dùng để xố phần tử khỏi đỉnh stack Hình sau mơ tả hình ảnh stack qua tác vụ: push(s,A): hình a push(s,B): hình b pop(s): hình c push(s,C): hình d 1.2 Mơ tả stack Mơ tả liệu: Stack kiểu liệu trừu tượng có nhiều nút kiểu liệu trải dài từ đáy stack đến đỉnh stack Mô tả tác vụ: • Tác vụ initialize: Chức năng: khởi động stack Dữ liệu nhập: không Dữ liệu xuất: stack top trở đầu stack • Tác vụ empty Chức năng: kiểm tra stack có rỗng hay khơng Dữ liệu nhập: khơng Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Dữ liệu xuất: TRUE|FALSE • Tác vụ push Chức năng: thêm nút đỉnh stack Dữ liệu nhập: nút Dữ liệu xuất: không • Tác vụ pop Chức năng: xóa nút đỉnh stack Dữ liệu nhập: không Điều kiện: stack không bị rỗng Dữ liệu xuất: nút bị xố • Tác vụ stacktop Chức năng: truy cập nút đỉnh stack Dữ liệu nhập: không Điều kiện: stack không bị rỗng Dữ liệu xuất: nút đỉnh stack • Tác vụ stacksize Chức năng: xác định số nút có stack Dữ liệu nhập: không Dữ liệu xuất: số nút có stack • Tác vụ clearstack Chức năng: xố tấc nút có stack Dữ liệu nhập: khơng Dữ liệu xuất: stack top vị trí khởi đầu 1.3 Ứng dụng stack • Stack thường dùng để giải vấn đề có chế LIFO • Stack thường dùng để giải vấn đề trình biên dịch ngơn ngữ lập trình như:  kiểm tra cú pháp câu lệnh ngơn ngữ lập trình  Xử lý biểu thức tốn học: kiểm tra tính hợp lệ dấu ngoặc biểu thức, chuyển biếu thức từ dạng trung tố (infix) sang dạng hậu tố (postfix), tính giá trị biểu thứ dạng hậu tố  Xử lý việc gọi chương trình • Stack thường sử dụng để chuyển giải thuật đệ qui thành giải thuật không đệ qui HIỆN THỰC STACK 2.1 Hiện thực stack danh sách kề Khai báo cấu trúc stack: mơt mẩu tin có hai trường:  Trường top: số nguyên đỉnh stack  Trường nodes: mảng chiều, phần tử mảng nút stack #define MAXSTACK 100 struct stack{ int top; int nodes[MAXSTACK]; } Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Tác vụ empty int empty(struct stack *ps){ if(ps->top==-1) return TRUE; else return FALSE; } Tác vụ push void push(struct stack *ps, int x){ ps->nodes[++(ps->top)]=x; } Tác vụ pop int pop(struct stack *ps){ if(empty(ps)){ printf(“Stack bi rong”); }else{ return ps->nodes[ps->top ]; } } 2.2 Hiện thực stack danh sách liên kết Khai báo cấu trúc stack: struct node{ char info; node *next; }; typedef struct node* NODEPTR; NODEPTR top; Tác vụ khởi tạo stack void initialize(){ top=NULL; } Tác vụ kiểm tra stack rỗng int empty(){ if (top==NULL) return TRUE; else return FALSE; } Tác vụ cấp phát nhớ Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack NODEPTR getnode(char c){ NODEPTR q; q=(NODEPTR)malloc(sizeof(struct node)); q->info=c; q->next=NULL; return q; } Tác vụ thêm phần tử vào stack void push(char c){ NODEPTR p; p=getnode(c); p->next=top; top=p; } Tác vụ lấy phần tử khỏi stack char pop(){ NODEPTR p; char c; f(top !=NULL){ p=top; top=top->next; c=p->info; free(p); return c; }else{ printf("\n stack trong"); return -1; } } CÁC CHƯƠNG TRÌNH MINH HOẠ 3.1 Chương trình đảo chuỗi dùng stack #include #include #include #include #define MAXSTACK 100 #define TRUE #define FALSE //dinh nghia stack struct stack{ int top; char nodes[MAXSTACK]; Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack }; //empty operation: check for whether stack is empty int empty(struct stack *ps){ if(ps->top==-1){ return TRUE; } else{ return FALSE; } } // dua ky tu vao stack void push(struct stack* ps, char x){ if(ps->top==MAXSTACK-1) printf("%s","Stack is full"); else{ ps->top+=1; ps->nodes[ps->top]=x; } } //lay mot ky tu khoi stack char pop(struct stack *ps){ if(empty(ps)) printf("%s","Stack bi rong"); else{ char c; c=ps->nodes[ps->top]; ps->top-=1; return c; } return ' '; } void main() { struct stack s; char c, chuoi[MAXSTACK]; int i, vitri; clrscr(); do{ s.top=-1; printf("\n\n Chuoi ban nhap vao:"); scanf("%s",chuoi); vitri =strlen(chuoi); for(i=0; itop==-1) return TRUE; else return FALSE; } //dua vao stack void push(STACK *ps, int x){ if(ps->top==MAXSTACK -1) printf("\n Stack bi day"); else{ ps->top++; ps->nodes[ps->top]=x; } } //lay khoi stack int pop(STACK *ps){ if(empty(ps)) printf("\nStack bi rong"); else{ int i=ps->nodes[ps->top]; ps->top ; return i; } return -1; } Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack void main(){ STACK s; int coso,so,sodu; char c; do{ s.top=-1; printf("\n Nhap vao mot so thap phan"); scanf("%d",&so); printf("\n Co so ban muon doi sang: "); scanf("%d",&coso); while( so !=0){ sodu=so %coso; push(&s, sodu); so=so/coso; } printf("\n So da doi la: "); while(!empty(&s)){ printf("%X",pop(&s)); } printf("\n \n Ban co muon tiep tuc khong? "); c=getche(); }while(c=='c'||c=='C'); } 3.3 Chương trình đảo chuỗi thực stack danh sách liên kết #include #include #include #define TRUE #define FALSE struct node{ char info; node *next; }; typedef struct node* NODEPTR; NODEPTR top; void initialize(){ top=NULL; } int empty(){ if (top==NULL) return TRUE; else return FALSE; } NODEPTR getnode(char c){ Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack NODEPTR q; q=(NODEPTR)malloc(sizeof(struct node)); q->info=c; q->next=NULL; return q; } void push(char c){ NODEPTR p; p=getnode(c); p->next=top; top=p; } char pop(){ NODEPTR p; char c; f(top !=NULL){ p=top; top=top->next; c=p->info; free(p); return c; }else{ printf("\n stack trong"); return -1; } } void main(){ char chuoi[30]; int chieudai,i; initialize(); printf("\n Nhap vao chuoi: "); scanf("%s",chuoi); chieudai=strlen(chuoi); for(i=0;ifront=pq->rear=MAXQUEUE-1; } Tác vụ kiểm tra hàng đợi trống: int empty(struct queue *pq){ if(pq->front==pq->rear) return TRUE; else{ return FALSE; } } Tác vụ thêm vào hàng đợi: void insert(struct queue *pq, int x){ if(pq->rear==MAXQUEUE -1) pq->rear=0; else pq->rear++; if(pq->rear==pq->front) printf(“Hang doi bi day”); else pq->nodes[pq->rear]=x; } Tác vụ xoá phần tử khỏi hàng đợi int remove(struct queue *pq){ if(empty(pq)) printf(“hang doi bi day”); else{ if(pq->front==MAXQUEUE-1) pq->front=0; else pq->front++; return pq->nodes[pq->front]; } } Tác vụ duyệt hàng đợi void traverse(struct queue *pq){ int i; if(empty(pq)){ printf(“Hang doi bi rong”); return; } Trang: 12 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack if(pq->front==MAXQUEUE-1) i=0; else i=pq->front+1; while(i!=pq->rear){ printf(“%d”,pq->nodes[i]); if(i==MAXQUEUE-1) i=0; else i++; } printf(“%d”,pq->nodes[i]); } 5.2 Dùng danh sách liên kết thực hàng đợi Ta cài đặt hàng đợi danh sách liên kết: trỏ đầu danh sách liên kểt front nút đầu hàng đợi, trỏ rear trỏ đến nút cuối hàng đợi Hình vẽ sau thể cách cài đặt hàng đợi danh sách liên kết Với cách cài đặt ta thực tác vụ hàng đợi như: insert, remove, empty…trên danh sách liên kết 5.3 Hàng đợi có ưu tiên Hàng đợi hoạt động nguyên tắc nút vào trước lấy trước, nút vào sau lấy sau hàng đợi khơng có ưu tiên Trong thực tế có dạng hàng đợi khác hoạt động theo chế: nút có độ ưu tiên cao lấy trước, nút có độ ưu tiên thấp lấy sau Hàng đợi lúc gọi hàng đợi có ưu tiên (priority queue) Có loại hàng đợi có ưu tiên: Hàng đợi có ưu tiên tăng: nút có độ ưu tiên cao lấy Hàng đợi có ưu tiên giảm: nút có độ ưu tiên giảm lấy trước Phần thực hàng đợi ưu tiên xem tập CHƯƠNG TRÌNH MINH HOẠ Giả sử có kho hàng có tính chất: mặt hàng nhập kho trước xuất kho trước, mặt hàng nhập kho sau xuất kho sau Chương trình có chức nhập kho, xuất kho, xem tồn kho… //CHUONG TRINH DEMO QUAN LY KHO BANG HANG DOI #include #include Trang: 13 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack #define MAXQUEUE 100 #define TRUE #define FALSE typedef struct mathang{ int mamh; char tenmh[12]; }; struct queue{ int front,rear; mathang nodes[MAXQUEUE]; }; void initialize(struct queue *pq){ pq->front=pq->rear=MAXQUEUE -1; } int empty(struct queue *pq){ if(pq->front==pq->rear) return TRUE; else return FALSE; } void insert(struct queue *pq, mathang x){ if(pq->rear==MAXQUEUE-1) pq->rear=0; else pq->rear++; if(pq->rear==pq->front) printf("Kho hang bi day"); else pq->nodes[pq->rear]=x; } mathang remove(struct queue *pq){ if(pq->front==MAXQUEUE -1) pq->front=0; else pq->front++; return pq->nodes[pq->front]; } void traverse(struct queue *pq){ int i; Trang: 14 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack if(empty(pq)){ printf("\n Kho khong hang"); return; } if(pq->front==MAXQUEUE-1) i=0; else i=pq->front+1; while(i !=pq->rear){ printf("\n%11d%15s",pq->nodes[i].mamh,pq->nodes[i].tenmh); if(i==MAXQUEUE-1){ i=0; } else{ i++; } } printf("\n%11d%15s",pq->nodes[i].mamh,pq->nodes[i].tenmh); } void main(){ struct queue q; int chucnang,front1; mathang mh; initialize(&q); do{ printf("\n\n\t\t CHUONG TRINH QUAN LY KHO"); printf("\n\t\t NHAP TRUOC XUAT TRUOC"); printf("\n\n Cac chuc nang cua chuong trinh"); printf("\n Nhap mot mat hang"); printf("\n Xuat mot mat hang"); printf("\n Xem mot mat hang chuan bi xuat"); printf("\n Xem mat hang moi nhap"); printf("\n Xem cac mat hang co kho"); printf("\n Xuat toan bo kho hang"); printf("\n Ket thuc chuong trinh"); printf("\n\n Chuc nang ban chon: "); scanf("%d",&chucnang); switch(chucnang){ case 1: printf("\n Ma mat hang: "); scanf("%d",&mh.mamh); printf("\n Ten mat hang: "); Trang: 15 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack scanf("%s",&mh.tenmh); insert(&q,mh); break; case 2: if(!empty(&q)){ mh=remove(&q); printf("\n Mat hang xuat: Ma: %d Ten: %s",mh.mamh,mh.tenmh); } else printf("\n Kho khong hang"); break; case 3: if(q.front==MAXQUEUE -1) front1=0; else front1=q.front+1; printf("\n Mat hang chuan bi xuat: Ma: %d Ten: %s ",q.nodes[front1].mamh,q.nodes[front1].tenmh); break; case 4: printf("\n Mat hang moi nhap: Ma: %d Ten: %s", q.nodes[q.rear].mamh,q.nodes[q.rear].tenmh); break; case 5: printf("\n Cac mat hang co kho: "); printf("\n %11s%15s", "MA MAT HANG","TEN MAT HANG"); traverse(&q); break; case 6: initialize(&q); break; } }while(chucnang !=0); } BÀI TẬP Hiện thực hàng đợi tác vụ hàng đợi danh sách liên kết Viết chương trình quản lý kho hàng dùng hàng đợi thực danh sách liên kết Viết chương trình thực hàng đợi có độ ưu tiên Biểu diễn biểu thức theo cú pháp Ba Lan Biểu thức nguyên dãy thành lập từ biến kiểu nguyên nối với phép tốn ngơi: +, -, *, / dấu ‘)’, ‘(’ Nguyên tắc đặc tên biến thứ tự thực phép toán thực sau: Trang: 16 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Qui tắc đặt tên biến: dãy ký tự chữ in thường ký tự số độ dài không 8, ký tự bắt đầu phải chữ Qui tắc thực phép toán: biểu thức dấu ngoặc đơn tính trước, phép tốn * / có độ ưu tiên cao phép tốn + - Dạng viết không dấu ngoặc Ba Lan cho biểu thức nguyên định nghĩa sau: - Nếu e tên biến dạng Ba Lan E - Nếu e1 e2 hai biểu thức có dạng viết Ba Lan tương ứng d1 d2 dạng viết Ba Lan e1+e2 d1 d2 +, e1-e2 d1 d2 -, e1*e2 d1 d2 *, e1 / e2 e1 e2 / -Nếu e biểu thức có dạng viết Ba Lan d dạng viết Ba Lan biểu thức có dấu ngoặc đơn (e) d Ví dụ biểu thức (c+b*(f-d)) có dạng viết Ba Lan c b f d - * + Cho file balan.in tổ chức thành dòng, dịng dài khơng q 80 ký tự biểu diễn biểu thức nguyên A Hãy dịch biểu thức nguyên A thành dạng viết Ba Lan A ghi vào file balan.out theo dịng Ví dụ Balan.in a+b a-b a*b a/b ((a+b)*c-(d+e)*f) Balan.out ab+ ab– ab* ab/ a b + c* d e + f * - Tính tốn giá trị biểu thức Ba Lan Cho file liệu balan.in gồm 2*n dịng đó, dịng có số thứ tự lẽ (1, 3, 5, …) ghi lại xâu biểu diễn Ba Lan biểu thức ngun A, dịng có số thứ tự chẵn (2,4,6…) ghi lại giá trị biến xuất biểu thức A Hãy tính giá trị biểu thức A, ghi lại giá trị A vào file balan.out dịng theo thứ tự: Dịng có thứ tự lẻ ghi lại biểu thức Ba Lan A sau thay giá trị tương ứng biến A, dịng có thứ tự chẵn ghi lại giá trị biểu thức A Ví dụ: Balan.in balan.out ab+ 35+ 35 ab73– 73 Lập lịch với mức độ ưu tiên Để lập lịch cho CPU đáp ứng cho trình đợi hệ thống, người ta biểu diễn trình ghi bao gồm thơng tin: số hiệu q trình số tự nhiên nhỏ 1024, tên trình xâu ký tự có độ dài khơng 32 ký tự, độ ưu tiên trình số nguyên dương nhỏ 10, thời gian thực trình số thực Các trình đợi hệ thống CPU đáp ứng thông qua hàng đợi gọi hàng đợi trình, hàng đợi trình với độ ưu tiên xây dựng cho điều kiện sau thoả mãn: - Các trình theo thứ tự ưu tiên - Đối với q trình có độ ưu tiên q trình có thời gian thực xếp lên trước Cho file liệu vào lich.in tổ chức sau: Trang: 17 Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack - Dòng ghi số n số q trình - n dịng kế tiếp, dịng ghi thơng tin q trình đợi Hãy xây dựng hàng đợi trình với độ ưu tiên Ghi lại thứ tự trình mà CPU đáp ứng dòng file lich.out Dòng ghi lại số cần thiết mà CPU cần phải đáp ứng cho trình Lich.in Data_processing 10 Editor_program 20 System_Call 0.5 System_interactive System_Action Writing_Data 20 Reading_Data 10 Lich.out 3457612 63.5 Trang: 18 .. .Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Dữ liệu xuất: TRUE|FALSE • Tác vụ push Chức năng: thêm nút đỉnh stack Dữ liệu nhập: nút Dữ liệu xuất: khơng • Tác... đỉnh stack  Trường nodes: mảng chiều, phần tử mảng nút stack #define MAXSTACK 100 struct stack{ int top; int nodes[MAXSTACK]; } Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack. .. In First Out) Trang: Giáo trình Cấu trúc liệu thuật giải Chương 3: Cấu trúc Stack Hàng đợi cấu trúc sử dụng rộng rãi thực tế: người ta dùng hàng đợi để giải vấn đề có cấu trúc FIFO xử lý dịch

Ngày đăng: 20/01/2014, 18:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan