队列的定义以及实现

队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表。

队列是一种先进先出的线性表,简称FIFO,允许插入的一端称之为队尾,允许删除的一端称之为队头。

线性表有顺序存储和链式存储,栈是线性表,队列作为一种特殊的线性表,也同样存在顺序存储结构和链式存储结构。

入队:在队列的末尾追加一个元素,不需要移动任何元素,其时间复杂度为O(1);

出队:队列元素的出列是在队头,即下标为0的位置,即队列中的所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,其时间复杂度为O(n);

一般,操作队列,引入两个指针来表示,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。

循环队列的定义:
顺序队列有一个缺点就是会造成假溢出,通过循环队列可以解决假溢出,使得顺序队列的rear指针指向下标为0的位置,通常把这种头尾相接的顺序存储结构称为循环队列。

判断队满的条件:

(rear+1)%QueueSize==front

通用的计算队列长度的公式为:

(rear-front+QueueSize)%QueueSize

循环队列的顺序存储结构的代码如下:

#define MAXSIZE 10
typedef int QElemType;
typedef  struct
{
    QElemType data[MAXSIZE];
    int front;
    int rear;
} SqQueue;

循环队列的初始化代码如下:

bool InitQueue(SqQueue *Q)
{
    Q->front = 0;
    Q->rear = 0;
    return true;
}

循环队列的入队操作代码如下:

//入队操作
bool EnQueue(SqQueue *Q, QElemType e)
{
    if ((Q->rear + 1) % MAXSIZE == Q->front)
    {
        cout << "队满" << endl;
        return false;
    }

    //将队尾指针指向新插入元素
    Q->data[Q->rear] = e;
    //将队尾rear指针向后移动一个位置
    Q->rear = (Q->rear + 1) % MAXSIZE;
    //打印添加到队列中的元素
    cout << e << endl;
    return true;
}

循环队列的出队操作代码如下:

//出队操作
bool DeQueue(SqQueue *Q, QElemType *e)
{
    //队列为空
    if (Q->front == Q->rear)
    {
        cout << "队空" << endl;
        return false;
    }
    *e = Q->data[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;
    //打印从队列中出队的元素
    cout << *e << endl;
    return true;
}

求队列的长度:

//求队列的长度
int GetQueueLength(SqQueue Q)
{
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

主函数中测试代码如下:

int main()
{
    SqQueue *S = new SqQueue;
    SqQueue *Q = InitQueue(S);
    //入队10个元素
    cout << "向队列中添加元素" << endl;
    for (auto i = 0; i < 10; i++)
    {
        EnQueue(Q, i);
    }
    //cout << "当前队列的长度为:" << GetQueueLength(*Q) << endl;
    //出队对中的元素,6个元素
    cout << "将队列元素中的元素出队" << endl;
    int temp = 0;
    for (auto i = 0; i < 15; i++)
    {
        DeQueue(Q, &temp);
    }
    delete S;
    return 0;
}

测试输出如下所示:

码码小虫

欢迎关注公众号,分享一些Unity3D、C#、C++数据结构和算法相关的学习知识。

码码小虫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值