顺序队列的实现(rear=当前位序加1)

队列是我们常见的排队序列,先来先得,顺序队列的实现是通过一片连续的存储空间去实现,并且拥有两个指针一个是front,一个是rear,分别指向队头和队尾,注意顺序队列难就难在这里,如何去判断队列的满与空有着不同的方法。例如将rear是否指向的是当前数据的下一个位置还是说指向当前位置,front亦同,不同的情况所要做的操作则大为不同。


队列的定义

typedef struct 
{
    int data[maxsize];
    int front, rear;//分别指向队头和队尾
}SqQueue;

定义一个结构体,包含一个元素数组和一个头指针及尾指针。

队列的初始化

//队列的初始化
int InitQueue(SqQueue &Q)
{
    Q.front = 0;//队头先用后加
    Q.rear = 0;//队尾先加后赋值
    return 1;
}

首先将头指针和尾指针指向同一个位置

 队列的判空

//队列的判空
int IsEmptyQueue(SqQueue Q) 
{
    if 
        (Q.front == Q.rear)return 1;
    else 
        return 0;
}

如果front与rear相等,则队列空

队列的入队

//队列的入队
int PushQueue(SqQueue& Q, int e) 
{
    if ((Q.rear + 1) % maxsize == Q.front)return 0;//判断队满
    Q.data[Q.rear] = e;//牺牲掉一个空间
    Q.rear = (Q.rear + 1) % maxsize;
    return 1;
}

首先判断队列是否满,设想如果单纯用rear与maxsize去比,则无法解决问题,当front开始移动的时候原本头部就位置空了,也就是还可以继续输入数据,所有要通过循环来控制指针,所以判断队列满的条件就是将rear+1取余maxsize若等于front则队列满,这需要牺牲掉一个空间。然后赋值rear循环加1。

队列的出队

//队列的出队
int PopQueue(SqQueue& Q, int& e) 
{
    if (Q.rear == Q.front)return 0;//表示队列空
    e = Q.data[Q.front];
    Q.front = (Q.front + 1) % maxsize;
    return 1;
}

首先判断队列是否空,若空直接返回结束。否则,将头指针的数据输出,然后front+1对maxsize循环取余。

队列的判满

//队列的判满
int IsQueueFull(SqQueue Q) 
{
    if ((Q.rear + 1) % maxsize == Q.front)return 1;
    return 0;
}

就是入队操作去掉了入队的过程。

求队头元素

//求队头元素
int GetTop(SqQueue Q,int &e)
{
    if (Q.front == Q.rear)return 0;//队空
    e = Q.data[Q.front];//只返回值不改变队头
    return 1;
}

首先判断是否为空,将头部元素返回,但不改变指针的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值