数据结构再学习--队列

队列遵循着先入先出的原则,由一个线性表和两个保存头尾索引的变量组成,为了节省空间和提高效率,可以把队列做成循环队列。使得移除的数据留下的空间可以循环利用,而仅仅失去一个位置用来处理判断队列是否为满。

下面是队列和循环队列的实现


// 普通的队列

void initXBQueue(XBQueue*q)//初始化队列
{
    q->front=-1;
    q->rear=-1;
}
int isXBQueueEmpty(XBQueue*q)//判断队列是否空
{
    if(q->front==q->rear)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
int isXBQueueFull(XBQueue*q)//判断是否满了
{
    if(q->rear==MAX_SIZE-1)
    {
        printf("队列已经满了,不能进入队列操作\n");
        return 1;
    }
    else
    {
        return 0;
    }
    
}
int getXBQueueLength(XBQueue q)//获取长度
{
    return (q.rear-q.front);
}
int insertXBQueue(XBQueue*q,DATATYPE m)//插入元素
{
    if(isXBQueueFull(q))
        return 0;
    q->rear=q->rear+1;
    q->qm[q->rear]=m;
    return 1;
}
int delXBQueueItem(XBQueue*q,DATATYPE *e)
{
    if(isXBQueueEmpty(q))return 0;
    q->front=q->front+1;
    *e=q->qm[q->front];
    return 1;
}
void printXBQueue(XBQueue q)
{
    int i;
    printf("队列的元素是:\n");
    for(i=q.front+1;i<=q.rear;i++)
    {
        printf("%d",q.qm[i]);
    }
    printf("\n");
}

// -----循环队列


// 循环队列初始化的时候可以设置,头指针和尾指针可以设置为0,不能设置为-1,否则循环部分计算复杂.
void initXBLoopQueue(XBLoopQueue*q)//初始化队列
{
    q->front=0;
    q->rear=0;
}
//相等的条件判断没有变化
int isXBLoopQueueEmpty(XBLoopQueue*q)//判断队列是否空
{
    if(q->front==q->rear)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
int isXBLoopQueueFull(XBLoopQueue*q)//判断是否满了
{
    if (q->front==0&&q->rear==M-1) {//这是一直插入但是没有取出的情况,所以最后一个位置无法存储元素。。
        return YES;
    }
    if (q->rear%M==q->front-1) { //这是出现了循环
        return YES;
    }
    return NO;

}
int getXBLoopQueueLength(XBLoopQueue q)//获取长度
{
    if (q.front<q.rear%M) {
        return q.rear - q.front;
    }
    else
    {
      return  M-q.front+q.rear;//这里处理循环的情景
    }
}
int insertXBLoopQueue(XBLoopQueue*q,DATATYPE m)//插入元素
{
    if(isXBLoopQueueFull(q)){
        return NO;
    }
    q->qm[q->rear]=m;
    q->rear=(q->rear+1)%M;
    return YES;
}
int delXBLoopQueueItem(XBLoopQueue*q,DATATYPE *e)
{
    if(isXBLoopQueueEmpty(q))return NO;
    *e=q->qm[q->front];
    q->front=(q->front+1)%M;
    return YES;
}
void printXBLoopQueue(XBLoopQueue q)
{
    printf("队列的元素是:\n");
    while (!isXBLoopQueueEmpty(&q)) {
        DATATYPE e;
        delXBLoopQueueItem(&q, &e);
        printf("%d  ",e);
    }
    printf("\n");

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值