队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。先进先出(First in First out)
循环队列的结构
struct SqQueue{
int data[MAXSIZE];
int front; //头指针
int rear; //尾指针
};
初始化
void Initqueue(SqQueue Q){
Q->front=0;
Q->rear=0;
}
求队列长度
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXSIZE) % MAXSIZE;
}
入队 出队
bool Enqueue(SqQueue Q,int x){
if((Q->rear+1)%MAXSIZE==Q->front){
return false;
}
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE; //整合rear和front大小的问题
return true;
}
bool Dequeue(SqQueue Q){
if(Q->front == Q->rear){
return false;
}
Q->front=(Q->front+1)%MAXSIZE;
return true;
}
队列的链式存储 头结点front>>队头a1>>结点a2>>队尾rear
结构
typedef struct QueuePrt *Next;
struct QueuePrt{ //结点结构
int data;
Next next;
};
struct Linlqueue{ //链表结构
Next front,rear;
};
入队和出队
bool EnQueue(LinkQueue Q,int e){
QueuePrt s=(QueuePrt)malloc(sizeof(struct QueuePrt));
if(!s){
return false;
}
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
return true;
}
bool DeQueue(LinkQueue Q){
QueuePrt p;
if(Q->front==Q->rear)
return false;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p){ //若链表处头结点外剩下一个元素,需要rear指向头结点
Q->rear=Q->front;
}
free(p);
return true;
}