1 Init Queue Q 2 Destroy Queue Q
- Slides: 75
基本操作: (1) Init. Queue (&Q) //构造空队列 (2) Destroy. Queue (&Q) //销毁队列 (3) Clear. Queue (&Q) //清空队列 (4) Queue. Empty(Q) //判空. 空--TRUE (5) Queue. Length(Q) //求队列长度 (6) Get. Head (Q, &e) //取队头元素, (7) En. Queue (&Q, e) //入队列 (8) De. Queue (&Q, &e) //出队列 (9) Queue. Traverse(Q, visit()) //遍历 }ADT Queue 11
单链队列--队列的链式存储结构 Typedef struct Qnode{ QElem. Type data; struct Qnode *next; }QNode, *Queue. Ptr; Typedef struct { Queue. Ptr front; //队头指针 Queue. Ptr rear; //队尾指针 }Link. Queue; 12
(1)链队列初始化 Status Init. Queue (Link. Queue &Q){ Q. front=Q. rear=(Queue. Ptr) malloc(sizeof(QNode)); if(!Q. front) return ERROR; Q. front->next=NULL; return OK; }//Init. Queue 13
(2)链队列判空 Status Queue. Empty (Link. Queue Q){ return (Q. front==Q. rear); }// Queue. Empty 14
(3)求链队列的长度 int Queue. Length (Link. Queue Q){ p=Q. front->next; //p指向队头 i=1; while(p!=Q. rear){ //遍历链队列, 统计结点数 i++; p=p->next; } return i; p=Q. rear }// Queue. Length p i=1 Q. front a 1 p a 2 … an Q. rear 15
(4)取链队列队头元素 Status Get. Head (Link. Queue Q, QElem. Type &e){ if(Q. front==Q. rear) return ERROR; e=Q. front->next->data; return OK; }//Get. Head e=Q. front->next->data Q. front a 1 a 2 … an Q. rear 16
(5)入队列 if(!p) return ERROR; p->data=e p->next=NULL Q. rear->next=p p->data=e; p->next=NULL; Q. rear=p Status En. Queue(Link. Queue &Q, QElem. Type e){ p=(Queue. Ptr)malloc(sizeof(QNode)); Q. rear->next=p; Q. rear=p; return OK; p }//En. Queue Q. front a 1 a 2 … e an Q. rear 17
(6)出队列 Status De. Queue (Link. Queue &Q, QElem. Type &e){ if(Q. front==Q. rear) return ERROR; p=Q. front->next; e=p->data; p=Q. front->next=p->next; if(Q. rear==p) Q. rear=Q. front; free(p); return OK; p }//De. Queue Q. front a 1 a 2 … an Q. rear 18
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue p Q. front a 1 a 2 … an Q. rear 19
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. front a 1 a 2 … an Q. rear 20
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 1 a 2 … an 21
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 1 a 2 … an 22
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 1 a 2 … an 23
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 1 a 2 … an 24
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 1 a 2 … an 25
(7)销毁队列 Status Destroy. Queue (Link. Queue &Q){ while(Q. front){ Q. rear=Q. front->next; free(Q. front); Q. front=Q. rear; } return OK: }// Destroy. Queue Q. rear Q. front a 2 … an 26
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: p }// Clear. Queue Q. front a 1 a 2 … an Q. rear 27
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: p }// Clear. Queue Q. front Q. rear a 1 a 2 … an 28
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: p }// Clear. Queue Q. front Q. rear a 1 a 2 … an 29
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: p }// Clear. Queue Q. front Q. rear a 1 a 2 … an 30
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: p q }// Clear. Queue Q. front Q. rear a 1 a 2 … an 31
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: q }// Clear. Queue Q. front Q. rear a 1 p a 2 … an 32
(8)清空队列 Status Clear. Queue (Link. Queue &Q){ Q. rear=Q. front; p=Q. front->next; Q. front->next=NULL; while(p){ q=p; p=p->next; free(q); } return OK: q }// Clear. Queue Q. front Q. rear a 1 p a 2 … an 33
(9)链队列的遍历 Status Queue. Traverse (Link. Queue Q, Status (*visit)(Elem. Type)) { for(p=Q. front->next; p<=Q. rear; p++) if(!visit(p->data) return ERROR; }// Queue. Traverse Status visit(Elem. Type e){ printf(“The value of the element is %dn”, (int) e); return OK; } 34
队列的顺序存储 6 5 4 3 2 Q. rear 1 0 Q. front 35
队列的顺序存储 6 入队: 5 Q. rear=Q. rear+1 4 3 Q. rear 2 1 0 J 1 Q. front 36
队列的顺序存储 6 入队: 5 Q. rear=Q. rear+1 4 Q. rear 3 2 1 J 2 0 J 1 Q. front 37
队列的顺序存储 6 入队: 5 Q. rear=Q. rear+1 4 3 2 J 3 1 J 2 0 J 1 Q. front 38
队列的顺序存储 6 Q. rear 入队: 5 Q. rear=Q. rear+1 4 3 J 4 2 J 3 1 J 2 0 J 1 出队: Q. front=Q. front+1 Q. front 39
队列的顺序存储 6 Q. rear 入队: 5 Q. rear=Q. rear+1 4 Q. front 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 出队: Q. front=Q. front+1 40
队列的顺序存储 6 Q. rear 入队: 5 Q. rear=Q. rear+1 4 Q. front 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 出队: Q. front=Q. front+1 41
队列的顺序存储 6 Q. rear 入队: 5 Q. rear=Q. rear+1 4 Q. front 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 出队: Q. front=Q. front+1 42
队列的顺序存储 Q. rear 6 入队: 5 Q. front 4 J 5 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 Q. rear=Q. rear+1 出队: Q. front=Q. front+1 43
队列的顺序存储 Q. rear 6 Q. front 5 J 6 4 J 5 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 入队: Q. rear=Q. rear+1 出队: Q. front=Q. front+1 44
队列的顺序存储 “假溢出” Q. rear Q. front 6 J 7 5 J 6 4 J 5 3 J 4 2 J 3 1 J 2 0 J 1 “逻辑上”删除 入队: Q. rear=Q. rear+1 出队: Q. front=Q. front+1 45
循环队列 如何解决“假溢出”? Q. front Q. rear Q. front 6 J 7 5 J 6 J 4 4 J 5 J 3 2 3 J 4 1 2 J 3 1 J 2 0 J 1 J 2 J 5 3 4 5 0 J 1 J 6 6 J 7 Q. rear 46
循环队列 Q. front 入队列: J 4 J 3 J 2 Q. rear=(Q. rear+1) % N J 5 3 4 2 5 1 0 J 1 J 6 出队列: Q. front=(Q. front+1) % N 6 J 7 队列长度: (Q. rear-Q. front+N) % N Q. rear 47
循环队列 Q. front J 4 J 3 J 2 Q. rear J 5 3 4 2 5 1 0 J 8 J 6 6 J 7 48
循环队列 Q. front J 4 Q. rear J 3 J 9 J 5 3 4 2 5 1 0 J 8 J 6 6 J 7 49
循环队列 Q. front Q. rear J 4 J 10 J 9 J 5 3 4 2 5 1 0 J 8 J 6 6 J 7 队列“满” 50
循环队列 Q. front Q. rear Q. front J 4 J 10 J 9 J 4 J 5 3 4 2 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” J 5 3 4 2 5 1 0 J 1 Q. rear J 6 6 J 7 51
循环队列 Q. front Q. rear Q. front J 4 J 10 J 9 J 4 J 5 3 4 2 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” J 5 3 4 2 5 1 0 J 1 Q. rear J 6 6 J 7 52
循环队列 Q. front Q. rear J 4 J 10 J 9 J 4 J 5 3 4 2 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” Q. front J 5 3 4 2 5 1 0 J 1 Q. rear J 6 6 J 7 53
循环队列 Q. front Q. rear J 4 J 10 J 9 J 4 J 5 3 4 2 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” J 5 3 4 2 5 1 0 J 1 J 6 6 J 7 Q. front Q. rear 54
循环队列 Q. front=Q. rear ? Q. front Q. rear 队列“空” J 4 J 10 J 9 J 4 J 5 3 4 2 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” J 5 3 4 2 5 1 0 J 1 Q. rear J 6 6 J 7 Q. front 55
Q. front=(Q. rear+1)%N Q. front=Q. rear Q. front Q. rear 队列“空” J 4 3 4 2 J 9 J 4 J 5 5 1 0 J 8 6 J 3 J 2 J 7 队列“满” J 5 3 4 2 5 1 0 J 1 Q. rear J 6 6 J 7 Q. front 56
循环队列的存储结构 #define MAXQSIZE 100 //最大队列长度 typedef struct { QElem. Type *base; //初始化的动态分配存储空间 int front; //头指针 int rear; //尾指针 }Sq. Queue; Sq. Queue Q; Q rear front QElem. Type base 58
(1)循环队列初始化 Status Init. Queue (Sq. Queue &Q){ //构造一个空队列Q Q. base=(QElem. Type *) malloc(MAXQSIZE *sizeof(QElem. Type)); if(!Q. base) return ERROR; Q. front=Q. rear=0; }//Init. Queue Q 0 0 base … return OK; maxsize 2 1 0 59
(2)销毁队列 Status Destroy. Queue (Sq. Queue &Q){ if(Q. base) free(Q. base); Q. base=NULL; Q. front=Q. rear=0; return OK: }// Destroy. Queue 0 0 NULL 60
(3)清空队列 Status Clear. Queue (Sq. Queue &Q){ Q. front=Q. rear=0; return OK: }// Clear. Queue 4 3 0 0 base 2 1 0 61
(4)队列判空 Status Queue. Empty (Sq. Queue Q){ return (Q. front==Q. rear); }// Queue. Empty 62
(5)求队列长度 int Queue. Length (Sq. Queue Q){ return (Q. rear-Q. front+MAXSIZE)%MAXSIZE; }// Queue. Length 63
(6)取队头元素 Status Get. Head (Sq. Queue Q, QElem. Type &e){ //返回队首元素 if(Q. front==Q. rear) return ERROR; e=Q. base[Q. front]; return OK; }//Get. Head e=Q. base[Q. front] 64
(7)入队列 Status En. Queue(Sq. Queue &Q, QElem. Type e){ if((Q. rear+1)%MAXQSIZE==Q. front) return ERROR; //队列满 Q. base[Q. rear]=e; Q. rear=(Q. rear+1)%MAXQSIZE; Q. rear return OK; }//En. Queue e Q. base[Q. rear]=e Q. rear=(Q. rear+1)%N Q. rear Q. front 65
(8)出队列 Status De. Queue (Link. Queue &Q, QElem. Type &e){ if(Q. front==Q. rear) return ERROR; e=Q. base[Q. front]; Q. front=(Q. front+1)%MAXQSIZE; return OK; Q. rear Q. front }//De. Queue e=Q. base[Q. front] Q. front=(Q. front+1)%MAXSIZE Q. front 66
(9)循环队列的遍历 Status Queue. Traverse (Sq. Queue Q, Status (*visit)(Elem. Type)) { i=Q. front; while(i!=Q. rear){ if(!visit(Q. base[i]) ) return ERROR; i=(i+1)%MAXSIZE; } return OK; }// Queue. Traverse Status visit(Elem. Type e){ printf(“The value of the element is %dn”, (int) e); return OK; } 67
例1 打印杨辉三角 1 1 2 1 1 1 3 4 3 1 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 69
void Yang. Hui. Triangle(int N) { Init. Queue(Q); En. Queue(Q, 1); for(n=2; n<=N; n++){ //第 1行元素入队 //产生第i行元素并入队,同时打印第i-1行元素 En. Queue(Q, 1); for(i=1; i<=n-2; i++){//利用第n-1行元素产生第n行的中间n-2个元素 De. Queue(Q, temp); printf(“%d”, temp); Get. Head(Q, x); temp=temp + x; En. Queue(Q, temp); } De. Queue(Q, x); printf(“%dn”, x); //打印第N-1行的最后一个元素 En. Queue(Q, 1); //第N行的最后一个元素入队 } while(!Queue. Empty(Q)){ //打印最后一行元素 De. Queue(Q, x); printf(“%d”, x); } } 70
Status Judge. Huiwen ( ) { Init. Queue(Q); Init. Stack(S); while((c=getchar())!=‘@’){ Push(S, c); En. Queue(Q, c) }; while(!Stack. Empty(S)){ Pop(S, a); De. Queue(Q, b); if(a!=b) return FALSE; } return TRUE; } 72
void See. Doctor ( ) { Init. Queue(Q); flag =1; while(flag){ printf(“n请输入命令:”);ch=getchar(); switch(ch){ case ‘a’: printf(“n病历号:”);scanf(“%d”, &n); En. Queue(Q, n); break; case ‘n’: if(!Queue. Empty(Q)){ De. Queue(Q, n); printf(“n病历号为%d的病人就诊”, n); } else printf(“n无病人等待就诊”);break; case ‘q’: printf(“n今天停止挂号,下列病人依次就诊”:); while(Queue. Empty(Q)){ De. Queue(Q, n); printf(“%d ”, n); } flag=0; break; default: break; } } 74
- Input restricted deque example
- Wireshark init.lua
- Failed to init ageia physics sdk
- Etinit
- Glutinit is not defined
- Grafcet init
- Gl_color_material
- Init.rc android
- Chase verb 3
- Modifiers of human acts tagalog
- Drinks destroy teeth
- How do cfcs destroy ozone
- Eph 4 31
- Vivienne westwood destroy nazi
- Xm destroy oracle vm
- John 10 nkjv
- Secrets destroy families
- To pull down to root out
- Plot diagram for marigolds by eugenia collier
- "missionaries destroy culture"
- The passive present perfect
- Effects on natural resources
- The enemy seeks to kill steal and destroy
- Binomial queue
- Priority queue animation
- Praveen
- Brodal queue
- Stack dan queue
- Double-ended priority queue
- Queue waiting time
- Applications of queue
- Adt queue
- Final jeopardy queue
- Binomial queue example
- Stack dan queue
- If the character d c b a are placed in a queue
- Adaptable priority queue java
- Queue abstract data type
- Homophone of ceiling
- Gadi queue limits
- Queue management system
- Queue quiz
- Bus stop queue
- Queue waiting time
- Queue hair
- Progress sonicmq
- Voxtron communication center
- Bottom up heap construction example
- Queue abstract data type
- Lazy binomial heaps
- Tad queue
- Actors queue
- Miningph
- Flip queue size
- Jenis jenis queue
- Flip queue size
- Amadeus queue management
- Little's formula queueing theory
- Types of queue in data structure
- Little's law
- Precision routing
- Repadmin /queue
- Difference between linked list and queue
- Dr mrani
- Queue in data structure
- Consider the linear queue with rear =4
- Sjf cpu scheduling
- Delay queue java
- Mm1 queue formulas
- Oci message queue
- Mlfq scheduler
- Queue head and tail
- Pvscsi queue depth
- The queue summary
- Classmethod aws
- Adaptive virtual queue management algorithm