重点:循环队列,链式队列
顺序队
定义
struct SqQueue
{
ElemType *base; //指向队列数组的指针,动态分配内存
int front;
int rear; //队尾位置的索引
int MAXSIZE;
}
初始化
void InitQueue(SqQueue &Q)
{
Q.base=new ElemType[MAXSIZE];
Q.front=Q.rear=0;
}
为了解决假溢出问题,从而提出了循环队列。
循环队列
定义
struct SqQueue
{
ElemType*base;
int front;
int rear;
int MAXSIZE;
}
与上面一样。
初始化
bool InitQueue(SqQueue &Q)
{
Q.base=new ElemType[MAXSIZE];
if(!Q.base)
{
cerr<<"out of memory"<< endl;
return false;
}
Q.rear=Q.front=0;
return true;
}
判断队列是否为空
bool IsEmpty(SqQueue &Q)
{
if(Q.rear==Q.front)
{
return true;
}
else
return false;
}
判断是否满队
bool IsFull(SqQueue &Q)
{
int rear_next=((Q.rear+1) % MAXSIZE); //队尾的下一个是否和队头重合
if(rear_next==Q.front)
{
return true;
}
else
return false;
}
入队
bool InsertQueue(SqQueue &Q,ElemTypr &e)
{
if((Q.rear+1)%MAXSIZE)==Q.front)
{
cerr<<"out of memory"<<endl;
return false;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return true;
}
出队
bool EraseQueue(SqQueue &Q)
{
if(Q.rear==Q.front)
{
cerr<<"error"<<endl;
return false;
}
Q.front=(Q.front+1)%MAXSIZE;
return true;
}
求队列长度
int QueueLength(SqQueue &Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
如果用户无法估计队列的长度则宜使用链队。
链队
定义
链队结构类似于链表,不同于链表的头指针,用两个指针域 front rere 来表示队列,如下图
typedef struct Qonde //定义队列的结点
{
ElemType data
Qnode*next
}* Queueptr;
struct LinkQueue //定义头指针和尾指针
{
Qonde*front;
Qonde*rear;
}
初始化
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new Qnode;
Q.front->next=nullptr;
}
进队
bool InsetQueue(LinkQueue &Q,ElemType &e) //从后面进
{
Qnode*p=new Qnode;
p->data=e;
if(!p)
{
cerr<<"error"<<endl;
return false;
}
Q.rear->next=p //没有空一个结点队尾指针就是指向最后一个元素
Q.rear=p;
return true;
}
出队
bool EreaseQueue(LinkQueue &Q,ElemType &e) //从前面出
{
Qnode*p=Q.front->next;
Q.front=p->next;
delete p;
return true;
if(Q.rear==p) //如果删除的是队尾元素
{
Q.rear=Q.front;
delete p;
return true;
}
}