和昨天的栈有一些类似,小孱弱弱今天分享的数据结构-队列,那是非常有意思~~,顾名思义呀,队列队列,就是排队呀,应该还记得栈的数据操作模式吧,仅在栈尾进行插入和删除操作,我们的队列呢,仅在队列头部删除,队列尾部插入,这就很清楚了吧,队列的应用很广泛,一定要搞清楚里面的思想哦。
进入正题:
先是循环队列,为什么不是顺序队列呢,顺序队列的有很多不足,每次我们做删除操作时,几乎所有元素都要移动,这显然大大提高复杂度,并不是我们想要的,但是循环队列就不一样了,插入删除不需要做大量元素的移动,只需要这是一个指针front指向队头,一个指针指rear向队尾的下一位,并且规定:队列queue满的条件是(rear+1)%QueueSize==front。具体请看代码实现:
相比顺序队列,链式队列的优点就体现出来了,代码实现和原理都非常简单,具体参考代码实现:
还有不明白的地方,请参考单链表
//顺序循环队列(定义)
typedef struct
{
int data[MAXN];
int front;
int rear;
} sqQueue;
//初始化空队列
int InitQueue(sqQueue *Q)
{
Q->front=0;
Q->rear=0;
return true;
}
//返回队列长度操作
int QueueLength(sqQueue Q)
{
return (Q.rear-Q.front+MAXN)%MAXN;
}
//增
int EnQueue(sqQueue *Q,int e)
{
if((Q->rear+1)%MAXN==Q->front)
return false;
Q->data[Q->rear]=e;
Q->data[Q->rear+1]%MAXN;
return true;
}
//删
int DeQueue(sqQueue *Q,int *e)
{
if(Q->front==Q->rear)
return false;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXN;
return true;
}
//链式队列(定义)
typedef struct QNode
{
int data;
struct Node *next;
} QNode,*QueuePtr;
//头尾指针
typedef struct
{
QueuePtr front,rear;
} LinkQueue;
//增 (入队操作)
int EnQueueu(LinkQueue *Q,int e)
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s)
return false;
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
return true;
}
//删(出队操作)
int DeQueue(LinkQueue *Q,int *e)
{
QueuePtr p;
if(Q->front==Q->rear)
return false;
p=Q->front->next;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=QQ->front;
free(p);
return true;
}