数据结构—顺序循环队列(附代码实现)

队列

概念
队列也是一种特殊的线性表。不过,线性表允许在任何位置插入和删除,而队列只允许在队尾插入,在队头删除,这样它就具有先进先出的性质

重点

顺序循环队列的假溢出问题
由于队尾指针rear的值和队头front的值不能由所定义存储空间的最大值自动转为所定义存储空间的最小值而产生

为了解决这个问题,有三种方法可以选择
1 少用一个存储单元
如果少用一个存储空间,则以队尾指针加1等于队头指针为队列满的判断条件,那么此时判断队列满的条件为
(rear+1)%Maxsize ==front
队列空的判断条件为:
rear=front;
(2)设置一个标志位

设置标志位为tag,初始时置tag=0;每当如队列操作成功,就置tag=1;每当出队列操作成功,就置tag=0.
此时队列空的判断条件为
rear==front && tag=0
队列满的条件为
rear==front && tag=1
(3)设置一个计数器
设计数器为count,初始时置count=0;每当如队列成功,就使count++;每当出队列成功,那就让count–。这样,计数器不仅具有计数功能,而且还具有标志位一样的标志作用,则此时队列空的判断条件为:count==0
队列满的条件为:
count>0 &&rear==front;
还可以是:
count=Maxsize;
附代码

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100

typedef int DataType;

typedef struct    //定义一个结构体
{
    DataType queue[Maxsize];
    int rear;        //队尾指针
    int front;       //队头指针
    int count;       //计数器
}SeqQueue;

void SeqQueueInitiate(SeqCQueue *Q)//队列初始化
{
    Q->rear=0;
    Q->front=0;
    Q->count=0;
}

int QueueNotEmpty(SeqQueue Q)//队列判空
{
    if(Q.count!=0)
        return 1;
    else return 0;
}
int QueueAppend(SeqQueue *Q,DataType x)//入队列
{
    if(Q->count >0 && Q->rear ==Q->front)
    {
        printf("队列已满无法插入");
        return 0;
    }
    else
    {
        Q->queue[Q->rear]=x;//将x插入队尾
        Q->rear=(Q->rear +1)%Maxsize;
        Q->count++;     //计数器加1
        return 1;
    }

}

int QueueDelete(SeqQueue *Q,DataType *d)//出队列
{
    if(Q->count ==0)
    {
        printf("队列已空\n");
        return 0;
    }
    else
    {
        *d=Q->queue[Q->front];//用指针d保存要删除的元素
    Q->front=(Q->front+1)%Maxsize;  //队头元素都给前移一位
    Q->count--;
    return 1;
    }

}
int QueueGet(SeqQueue Q,DataType *d)//取数据
{
    if(Q.count ==0)
    {
        printf("队列已空无数据可取!\n");
        return 0;
    }
    else
    {
        *d=Q.queue[Q.front];
        return 1;

    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值