【C++】【数据结构复习】队列

重点:循环队列,链式队列

顺序队

定义
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;
   }
}

   

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值