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