1 Init Queue Q 2 Destroy Queue Q

  • Slides: 75
Download presentation

基本操作: (1) Init. Queue (&Q) //构造空队列 (2) Destroy. Queue (&Q) //销毁队列 (3) Clear. Queue

基本操作: (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

单链队列--队列的链式存储结构 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)

(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

(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){ //遍历链队列,

(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

(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.

(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

(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);

(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);

(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);

(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);

(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);

(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);

(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);

(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);

(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;

(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;

(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;

(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;

(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;

(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;

(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;

(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.

(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 4 3 2 Q. rear 1 0 Q. front 35

队列的顺序存储 6 入队: 5 Q. rear=Q. rear+1 4 3 Q. rear 2 1 0

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 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

队列的顺序存储 “假溢出” 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

循环队列 如何解决“假溢出”? 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) %

循环队列 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

循环队列 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

循环队列 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

循环队列 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

循环队列 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

循环队列 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

循环队列 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

循环队列 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

循环队列 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

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;

循环队列的存储结构 #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.

(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.

(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.

(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

(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

(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)

(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;

(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

(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.

(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 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++){

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.

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

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