数据结构-队列
队列是典型的 FIFO 数据结构。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾。 删除(delete)操作也被称为出队(dequeue)。 移除第一个元素。
C++实现循环队列加深理解
#include <iostream>
#include <vector>
#include <algorithm>
class Myqueue {
public:
Myqueue();
Myqueue(int k);
~Myqueue();
int GetFront();//返回队首元素,不存在返回-1
int GetBack();//返回队尾元素,不存在返回-1
bool enQueue(int value);//向循环队列插入一个元素,成功返回真
bool deQueue();//从队列删除一个元素,成功返回真
bool isEmpty();//检查队列是否为空
bool isFull();//检查队列是否为满
private:
int rear;
int front;
int count;
std::vector<int> nums;
};
Myqueue::Myqueue():rear(0),front(0),count(0) {
nums.resize(128);
}
Myqueue::~Myqueue() {
}
Myqueue::Myqueue(int k) :rear(0), front(0), count(0) {
nums.resize(k);
}
bool Myqueue::enQueue(int value) {//向循环队列插入一个元素,成功返回真
if (count == nums.size()) {
return false;
}
nums[rear++] = value;
rear %= nums.size();//只要start小于nums.size(),start就等于自己,要是start==nums.size(),那start就等于0
++count;
return true;
}
bool Myqueue::deQueue() {//从队列删除一个元素,成功返回真
if (count == 0) {
return false;
}
nums[front++] = 0;
front %= nums.size();
--count;
return true;
}
int Myqueue::GetFront() {//返回队首元素
if (count == 0) return -1;
return nums[front];
}
int Myqueue::GetBack() {//返回队尾元素
if (count == 0) return -1;
return nums[(rear-1+nums.size())%nums.size()];
}
bool Myqueue::isEmpty() {//判断队列是否为空
return count == 0;
}
bool Myqueue::isFull() {//判断队列是否为满
return nums.size() == count;
}
int main()
{
Myqueue Queue(10);
for (int i = 1; i < 10; ++i) {
Queue.enQueue(i);
}
Queue.deQueue();
Queue.enQueue(10);
Queue.enQueue(11);
Queue.deQueue();
Queue.enQueue(12);
std::cout << Queue.GetFront()<<std::endl;
std::cout << Queue.GetBack() << std::endl;
return 0;
}
STL标准模板库的队列-queue
一般用C++就无需自己写queue重复造轮子了,STL库的容器queue底层内存分配器可以自动规划内存,且能支持几乎所有类型数据,十分方便
#include <iostream>
#include <queue>
#include <algorithm>
#include <time.h>
int main()
{
std::queue<char> Queue;
std::queue<char> King;
std::queue<int> Jack;
std::cout << (Queue.empty() ? "queue empty!" : "queue not empty.") << std::endl;
for (int i = 'a'; i <= 'g'; i++) {
Queue.push(i);//a,b,c,d,e,f,g
King.push(i + 10);//k,i,m,n,o,p,q
}
std::cout << (Queue.empty() ? "queue empty!" : "queue not empty.") << std::endl;
std::cout << "Queue size:" << Queue.size() << std::endl;
std::cout << "Queue Front:" << Queue.front() << std::endl;
std::cout << "Queue Back:" << Queue.back() << std::endl;
Queue.emplace('h');//同Queue.push,队尾入队
std::cout << "Queue Now Back:" << Queue.back() << std::endl;
std::cout << "Queue Now size:" << Queue.size() << std::endl;
Queue.swap(King); // Queue和King里的元素交换了
std::cout << "King Front:" << King.front() << std::endl;
King.pop();//队首出队
std::cout << "King Now Front:" << King.front() << std::endl;
std::cout << "time:" << clock() << std::endl;
std::cout << "Jack size:" << Jack.size() << std::endl;
for (long long i = 0; i < 1000000; i++) {
Jack.push(i);
}
std::cout << "Now time:" << clock() << std::endl; //放一百万个元素进去经过了大约600ms
std::cout << "Jack Now size:" <<Jack.size() << std::endl;
return 0;
}
输出:
queue empty!
queue not empty.
Queue size:7
Queue Front:a
Queue Back:g
Queue Now Back:h
Queue Now size:8
King Front:a
King Now Front:b
time:107
Jack size:0
Now time:757
Jack Now size:1000000
STL标准模板库的优先队列-priortty_queue
priortty_queue和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <time.h>
using namespace std;
int main() {
auto Less = priority_queue<int,vector<int>,less<int>>(); //指定降序队列,最后一个参数为仿函数,也可以自定义
auto Greater = priority_queue<int, vector<int>,greater<int>>(); //指定升序队列
for (int i = 1; i <= 5; ++i) {
Less.push(i);
Greater.push(i);
}
while (!Less.empty()) {//降序,所以最大的就在top
cout << Less.top()<<"-";
Less.pop();
}
cout <<"null"<< endl;
while (!Greater.empty()) {//升序。最小的在top
cout << Greater.top() << "-";
Greater.pop();
}
cout <<"null"<< endl;
return 0;
}
输出:
5-4-3-2-1-null
1-2-3-4-5-null