数据结构-队列

队列是典型的 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
posted @ 2020-09-11 12:01  JoyooO  阅读(151)  评论(0编辑  收藏  举报