使用线性表来实现队列相较于单链表实现较为麻烦,首先就是容量的问题,不如单链表灵活,其次是为了解决空溢出的问题,需要用到取余操作,此操作的具体解释可见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;
}
下面是输出结果: