线性表实现队列的基本操作

使用线性表来实现队列相较于单链表实现较为麻烦,首先就是容量的问题,不如单链表灵活,其次是为了解决空溢出的问题,需要用到取余操作,此操作的具体解释可见B站王卓老师的数据结构。

1:定义

typedef struct SqlistQueue
{
    int* base;
    int front;
    int tail;
}Queue;

定义基地址和头尾的指针(其实就是来标记一下队头队尾的下标而已,严格来讲说作指针并不合理)

2:初始化

void InitQueue(Queue& q)
{
    q.base = new int[MAXSIZE];
    q.front = q.tail = 0;
}

给基地址开辟一块空间,其中的MAXSIZE可以在开头使用define定义,其次将头尾标号全置为0。

3:入队

void EnQueue(Queue& q, int x)
{
    if ((q.tail + 1) % MAXSIZE == q.front)
    {
        cout << "FULL!";
        return;
    }
    else
    {
        q.base[q.tail] = x;
        q.tail = (q.tail + 1) % MAXSIZE;
    }
}

这里用到的取余操作就要看一下王卓老师的数据结构网课来理解了,头尾指针的后移操作全都是通过取余来实现,入队是队尾指针后移,出队是队头指针后移,这种结构叫做循环队列,例如开辟了6个空间,在这种结构下只能使用5个空间,一定要闲置一个来作为队满队空的判断条件。(q.tail + 1) % MAXSIZE == q.front就是队满的条件。

4:出队

void DeQueue(Queue& q)
{
    if (q.front == q.tail)
        return;
    else
    {
        q.front = (q.front+1) % MAXSIZE;
    }
}

队空的条件就是q.front == q.tail,如果不空需要出队操作,就需要将头指针后移。

5:取队头元素

int GetHead(Queue q)
{
    if (q.front != q.tail)
        return q.base[q.front];
}

如果队列不空,那么返回队头元素即可。

6:队列长度(元素个数)

int QueueLength(Queue q)
{
    return (q.tail - q.front + MAXSIZE) % MAXSIZE;
}

这里的返回表达式同样需要看B站王卓老师的数据结构来理解,这里是满足了3种情况后得出的最终表达式。分别满足tail<front, tail>front, tail=front的情况。

7:队列是否为空

bool QueueEmpty(Queue q)
{
    return q.front == q.tail;
}

直接返回q.front == q.tail即可,这里就是队列空的条件。

下面是全代码:

#include<iostream>
using namespace std;
#define MAXSIZE 6
typedef struct SqlistQueue
{
    int* base;
    int front;
    int tail;
}Queue;
void InitQueue(Queue& q)
{
    q.base = new int[MAXSIZE];
    q.front = q.tail = 0;
}
void EnQueue(Queue& q, int x)
{
    if ((q.tail + 1) % MAXSIZE == q.front)
    {
        cout << "FULL!";
        return;
    }
    else
    {
        q.base[q.tail] = x;
        q.tail = (q.tail + 1) % MAXSIZE;
    }
}
void DeQueue(Queue& q)
{
    if (q.front == q.tail)
        return;
    else
    {
        q.front = (q.front+1) % MAXSIZE;
    }
}
int GetHead(Queue q)
{
    if (q.front != q.tail)
        return q.base[q.front];
}
int QueueLength(Queue q)
{
    return (q.tail - q.front + MAXSIZE) % MAXSIZE;
}
bool QueueEmpty(Queue q)
{
    return q.front == q.tail;
}
int main()
{
    Queue q;
    InitQueue(q);
    EnQueue(q, 1);
    EnQueue(q, 2);
    EnQueue(q, 3);
    EnQueue(q, 4);
    EnQueue(q, 5);
    cout << "THE HEAD IS:" << GetHead(q) << endl;
    cout << "队列元素输出并出队列:" << endl;
    while (!QueueEmpty(q))
    {
        cout << GetHead(q) << " ";
        DeQueue(q);
    }
    cout << "\n";
    cout << "队列元素再次输入后输出队列:" << endl;
    EnQueue(q, 6);
    EnQueue(q, 7);
    while (!QueueEmpty(q))
    {
        cout << GetHead(q) << " ";
        DeQueue(q);
    }
    return 0;
}

下面是输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值