队列原理详解

队列是什么

队列也是一种特殊的表(list)。表通常分为三种:
1.链表(linked list):随机插入,随机删除;
2.栈(stack):先进后出(FILO);
3.队列(queue):先进先出(FIFO)。
可以把队列想象成排队的队伍。显然,最先排队的人最先得到服务,然后离开队伍;队尾不断有其他人加入。队列正是模拟了现实世界的这一普遍情景。
这里写图片描述

队列的作用

队列在网络、消息传递、图论中的应用比较广泛。举个例子,图的广度优先搜索就是用队列来实现的。

队列的实现

本文采用数组的方式实现了一个循环队列。队列模板类包含了一个数组、两个下标(front和rear)和队列大小等成员变量,同时也实现了绝大多数队列操作。
队列模板类的定义:

template <class T>
class Queue
{
public:
    Queue();
    ~Queue();

    bool isEmpty();
    bool isFull();
    int size();

    void create(int capacity);
    void clear();
    void destroy();

    void enqueue(T val);
    void dequeue();
    T front();

private:
    int succ(int pos);

    int _front;//队首索引
    int _rear;//队尾索引
    int _size;//队列大小
    int _capacity;//队列容量
    T *_array;//保存队列数据的数组
};

下面是具体的队列操作实现:
1.判断队列是否为空

template <class T>
bool Queue<T>::isEmpty()
{
    return _size == 0;
}

2.判断队列是否已满

template <class T>
bool Queue<T>::isFull()
{
    return _size == _capacity; 
}

3.获取队列大小

template <class T>
int Queue<T>::size()
{
    return _size;
}

4.创建队列

template <class T>
void Queue<T>::create(int maxSize)
{
    _array = new T[maxSize];
    _capacity = maxSize;
}

5.清空队列

template <class T>
void Queue<T>::clear()
{
    _front = 1;
    _rear = 0;
    _size = 0; 
}

6.删除队列

template <class T>
void Queue<T>::destroy()
{
    _front = 1;
    _rear = 0;
    _size = 0; 
    _capacity = 0;
    delete [] _array;
}

7.入队

template <class T>
void Queue<T>::enqueue(T val)
{
    if (!isFull())
    {
        _rear = succ(_rear);
        _array[_rear] = val;
        _size++;
    }
}

8.出队

template <class T>
void Queue<T>::dequeue()
{
    if (!isEmpty())
    {
        _front = succ(_front);
        _size--;
    }
}

9.获取队首

template <class T>
T Queue<T>::front()
{
    if (!isEmpty())
    {
        return _array[_front];
    }
    return NULL;
}

10.计算后继索引

//由于实现的是循环队列,所以当索引值超过队列容量时索引会自动变成0,回到队列的起点
template <class T>
int Queue<T>::succ(int pos)
{
    return (pos + 1) % _capacity;
}

结果展示

测试代码:

#include "queue.h"

using namespace std;

int main()
{
    Queue<int> queue;
    queue.create(10);

    for (int i=0; i<8; i++)
    {
        queue.enqueue(i);
    }

    for (int i=0; i<8; i++)
    {
        queue.dequeue();
    }

    for (int i=0; i<8; i++)
    {
        queue.enqueue(i);
    }

    cout << "Queue size:" << queue.size() << endl;

    cout << "Queue front:";
    for (int i=0; i<5; i++)
    {
        int val = queue.front();
        cout << val << " ";
        queue.dequeue();
    }

    cout << endl << "Queue size:"  << queue.size() << endl;

    return 0;
}

结果:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值