队列:队列时只允许在一端进行插入,而在另一端进行删除的线性表
队头:允许删除的一端,成为队首
队尾:允许插入的一端
队列:先进先出
顺序队列
用数组实现队列,可以将队首放在数组下标为0的位置(但不要求从数组队尾开始存储队列,也就是说,队首不一定要在数组下标为0的位置)
结构:
#define maxsize 50
typedef struct aa
{
elemtype data[maxsize]; //存放队列元素
int front; //队头指针
int rear; //队尾指针(指向队尾元素的下一个位置)
}queue;
循环队列
首尾相连的顺序储存
入队:rear=(rear+1)%maxsize
出队:front=(front+1)%maxsize
循环队列判断空和满:把front=rear仅作为队空的判断条件,当队列满时,令数组中仍保留一个空条单元,我们认为这种情况即是队满
(rear+1)%maxsize==front(队满`)
队列中元素个数
(rear-front+maxsize)%maxsize;
出队:
bool queue(Queue &Q,elemtype &x)
{
if(Q.rear==Q.front) return false; //队空,报错
x=Q.data[Q.front];
Q.front=(Q.front+1)%maxsize;
return true;
}
入队:
bool queue(Queue &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;
}
链式队列
分别设置头指针和尾指针
队头指针指向头结点,队尾指针指向尾结点
结构:
typedef struct linknode //链式队列结点
{
elemtype data;
struct linknode *next;
}linknode;
typedef struct //链式队列
{
linknode *front,*rear; //队头和队尾指针
}linkqueue;
入队:入队就是在队尾进行插入结点操作,链队的插入操作和单链表插入一致
void queue(linkqueue &Q,elemtype x)
{
s=(linknode*)malloc (sizeof(linknode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
出队:出队就是头结点的后继结点出队,然后将头结点的后继改为它后面的结点
bool queue(linkqueue &Q,elemtype &x)
{
if(Q.front==Q.rear) return false; //空队
p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front; //若原队列中只有一个结点,删除后变空
free(p);
return true;
}