3.2 队列的基本概念
3.2.1队列的定义
InitQueue(&Q): QueueEmpty(Q): EnQueue(&Q,X): DeQueue(&Q,&x): GetHead(Q,&x): ClearQueue(Q,&x):
3.2.2 队列的顺序结构
#define Maxsize 50 typedef struct{ ElemType data[Maxsize]; int front ,rear; }sqQueue;
队列的顺序储存: Q.front==Q.rear==0; 进队操作:先判断队列是否满了。如果没满,送到队尾,再将队尾的指针加一; 出队操作:先判断队是否为空,队不空时候,先取出队头元素,再将队头指针加一; 队满:无法实现,如果说等于Q.rear==Maxsize;这样会出现溢出。
解决溢出;采用循环队列
循环队列: 初始时候:Q.front=Q.rear=0; 出队:Q.front=(Q.front+1)%MaxSize。 进队:Q.rear=(Q.rear+1)%MaxSize; 队列长度:(Q.rear+MaxSize-Q.front)%MaxSize; 牺牲一个单元: 队满条件:(Q.rear+1)%MaxSize==Q.front; 队空条件:Q.front==Q.rear 队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
循环队列的基本操作:
初始化: void InitQueue(SqQueue &Q){ Q.rear=Q.front=0; }
判断空: bool isEmpty(sqQueue Q){ if(Q.rear==Q.front) return true; else return false; }
入队: bool EnQueue(sqQueue &Q,ElemType x){ if((Q.rear+1)%MaxSize==Q.front) return false; Q.data[Q.rear]=x; Q.rear=(Q.rear+1)%MaxSize; return true; }
出队: bool DeQueue(SqQueue &Q,ElemType &x){ if(Q.rear==Q.front) return flase; x=Q.data[Q.front]; Q.front=(Q.front+1)%Maxsize; return ture; }
3.2.3 队列的链式结构
typedef struct{ ElemType data; struct LinkNode *next; }LinkNode; typedef struct{ LinkNode *front,*rear; }LinkQueue;
基本操作:
void InitQueue(LinkQueue &Q){ Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode)); Q.fornt->next=NULL; }
bool IsEmpty(LinkQueue Q){ if(Q.front=Q.rear) return ture; else return false; }
入队: Viod EnQueue(LinkQueue &Q,ElemType x){ LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode)) s->data=x;s->next=NULL; Q.rear->next=s; }
出队;bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.front==Q.rear) return false; LinkNode *p=Q.front->next; x=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; }