队列的C++实现

队列的C++实现

队列的特点就是先进先出(LILO),最形象的就是排队买包子,你总不希望你后面的人先买完走掉吧。
C++提供deque容器,可以直接包含头文件,然后调用函数。这里主要写队列的一些基本功能吧,包括判断是否为空(empty),入队列(add),出队列(Remove),获取队列中最前面的元素(front),获取队列中最后面的元素。队列元素的进出和栈中元素的进出是有区别的,如果队列最前面元素出队列,那么其后面的元素应该依次向前移,而栈则不用改变位置。怎么能让这些元素不移动呢,如果将数组看成一个圆形,我们只移动指向第一个元素的索引(myfront)和指向最后一个元素的索引(myback),如果第一元素出队列,则myfront+1,如果一个元素如队列,则myback+1。那有人会问了,比如说一个长度为6的数组,当myfront=2,myback=5时,再进来一个元素,myback=6数组不就溢出了吗?真是的情况是myback=0,怎么办呢?在跑步的时候,假设一圈400m,跑完一圈,再继续跑,总共跑了600m,你现在在什么位置呢?答:600%400=200。这下一目了然了,用(myback+1)%6代替就可以了(这里的myback是当前值),myfront同理。
我觉得难的地方已经解决了。接下来附上Queue类模板。

#include <iostream>
using namespace std;
const int QUEUE_CAPACITY = 128;
template <typename QueueElement>
class Queue
{
public:
    Queue();
    bool empty()const;
    void add(QueueElement &value);
    void Remove();
    QueueElement front() const;
    void display()const;
private:
    int myfront;
    int myback;
    QueueElement myarray[QUEUE_CAPACITY];
};
template <typename QueueElement>
Queue<QueueElement>::Queue()
{
    myfront = myback = -1;
}
template <typename QueueElement>
bool Queue<QueueElement>::empty() const
{
    return (myback == -1 && myfront == -1);
}
template <typename QueueElement>
void Queue<QueueElement>::add(QueueElement &value)
{
    if ((myback + 1) % QUEUE_CAPACITY == myfront)
        cout << "Queue is full!" << endl;
    else
    {
        if (myfront==-1)
        {
            myfront = 0;
        }
        myback = (myback + 1) % QUEUE_CAPACITY;
        myarray[myback] = value;
    }
}
template <typename QueueElement>
void Queue<QueueElement>::Remove()
{
    if (empty())
        cout << "Queue is empty!" << endl;
    else
        myfront = (myfront + 1) % QUEUE_CAPACITY;
}
template <typename QueueElement>
QueueElement Queue<QueueElement>::front() const
{
    if (empty())
        cout << "Queue is empty!" << endl;
    else
        return myarray[myfront];
}
template <typename QueueElement>
void Queue<QueueElement>::display()const
{
    if (empty())
        cout << "Queue is empty!" << endl;
    else
    {
        if (myfront < myback)
            for (int i = myfront; i <= myback; i++)
                cout << myarray[i] << endl;
        else
        {
            for (int i = myfront; i <= QUEUE_CAPACITY;i++)
                cout << myarray[i] << endl;
            for (int i = 0; i <= myback;i++)
            {
                cout << myarray[i] << endl;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值