PS.更多数据结构知识详见:
八大数据结构
C++队列的用法
队列的数据结构
ADT 队列(Queue)
Data
同线性表。具有相同的数据类型,相邻的元素存在前驱和后继关系
Opreation
InitQueue(): 初始化一个空的队列
DestoryQueue(): 销毁队列
ClearQueue(): 清空队列元素
QueueEmpty(): 判断队列是否为空,是则返回true,否则返回false
GetHead(): 获取队首元素
EnQueue(e): 将元素e入队列
DeQueue(): 删除队首元素
QueueLength(): 返回队列Q的元素个数
基于数组的队列
class ArrayQueue {
int length;
int head;
int tail;
int* ptr;
int count;
public:
ArrayQueue(int len)
{
length = len;
head = 0;
tail = 0;
count = 0;
ptr = new int[len];
}
~ArrayQueue()
{
delete[]ptr;
}
void clear()
{
head = tail = count = 0;
}
bool empty()
{
return count == 0 ? true : false;
}
int front()
{
if (count)
{
return ptr[head];
}
return -1;
}
void push(int val)
{
if (tail != length)
{
ptr[tail] = val;
tail++;
count++;
}
else
{
cout << "队列空间已满!" << endl;
}
}
void pop()
{
if (count)
{
head++;
count--;
}
}
int size()
{
return count;
}
};
基于链表的队列
struct LinkList
{
int val;
LinkList* next;
LinkList(int val = -1, LinkList* next = nullptr) :val(val), next(next) {}
};
class LinkQueue
{
LinkList* head;
LinkList* tail;
int count;
public:
LinkQueue()
{
head = new LinkList(0);
tail = head;
count = 0;
}
~LinkQueue()
{
clear();
delete head;
}
void clear()
{
while (head->next)
{
LinkList* del = head->next;
head->next = del->next;
delete del;
}
count = 0;
}
bool empty()
{
return count == 0 ? true : false;
}
void push(int val)
{
tail->next = new LinkList(val);
tail = tail->next;
count++;
}
int front()
{
if (count)
return head->next->val;
return -1;
}
void pop()
{
if (head != tail)
{
LinkList* del = head;
head = head->next;
delete del;
count--;
}
}
int size()
{
return count;
}
};
测试队列
基于数组的队列
void testArrayQueue()
{
ArrayQueue* que = new ArrayQueue(10);
que->push(1);
que->push(2);
que->push(3);
que->push(4);
que->push(5);
cout << "输出队列的所有元素:" << endl;
while (!que->empty())
{
cout << que->front() << " ";
que->pop();
}
que->push(1);
que->push(2);
que->push(3);
que->push(4);
que->push(5);
cout << endl << endl;
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
cout << endl << endl;
cout << "删除队首元素" << endl;
que->pop();
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
cout << endl << endl;
cout << "清空队内元素 " << endl;
que->clear();
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
}
基于链表的队列
void testLinkQueue()
{
LinkQueue* que = new LinkQueue;
que->push(1);
que->push(2);
que->push(3);
que->push(4);
que->push(5);
cout << "输出队列的所有元素:" << endl;
while (!que->empty())
{
cout << que->front() << " ";
que->pop();
}
que->push(1);
que->push(2);
que->push(3);
que->push(4);
que->push(5);
cout << endl << endl;
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
cout << endl << endl;
cout << "删除队首元素" << endl;
que->pop();
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
cout << endl << endl;
cout << "清空队内元素 " << endl;
que->clear();
cout << "队首元素为 :" << que->front() << endl;
cout << "队内的元素个数为:" << que->size() << endl;
}
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6594bc10133dac45a1243d81e397475e.png)
队列的应用
1.单调队列求滑动窗口的最大值
2.优先级队列求最大的k个值