#数据结构# 队列

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;

}

おすすめ

転載: blog.csdn.net/weixin_45840087/article/details/105851316