队列实现的队列

时间:2016-03-10 16:16:23

标签: c++ queue

我最近排队数据结构。为了练习和学习新东西,我决定在没有STL库的情况下实现它。问题是,我很难真正区分典型的数组和队列。

我定义了简单的类

class Queue{

public:

    Queue();
    Queue(int);


    void enqueue(int);
    int dequeue();
    int  first_out() ;
    int  last_out() ;
    bool isEmpty();
    bool isFull();

private:

    int current;
    int maxi;
    int *arr;
    int frontt;
    int rear;

};

其构造函数

Queue::Queue(int maxo){
    this -> current = 0;
    this -> maxi = maxo;
    this -> arr = new int[maxi];
    this -> frontt = 0;
    this -> rear = 0;
}

enqueue方法,当它尝试访问大于最大索引的索引时,重新分配内部数组。

void Queue::enqueue(int a){
    if( this -> rear == this -> maxi){

        int *temp;
        int tmp = maxi;
        while( this -> rear >= this -> maxi){
            this -> maxi *= 2;
        }
        temp = new int[maxi];
        for( int i = 0; i < tmp ; i++){
            temp[i]=arr[i];
        }
        rear = maxi;
        delete[] arr;
        arr = temp;

    }
    this -> arr[rear++] = a;


}

将哪个增量前索引出列。

int Queue::dequeue(){



return arr[frontt++];

    }
    int Queue::first_out(){

        return arr[frontt];

    }

    int Queue::last_out(){

        return arr[rear-1];

    }

    bool Queue::isEmpty(){

        if( this -> frontt == this -> rear){
            cout << "Queue is empty" << endl;
            return 1;
        }
        return 0;
    }
    bool Queue::isFull(){

        if( this -> frontt == (this -> rear+1) % this -> maxi){


            return 1;

        }
        return 0;
    }

测试它的主要功能

Queue tst(5);
    cout << "Write numbers" << endl;
    int n;
    while( cin >> n){
        tst.enqueue(n);
    }
    tst.dequeue();
    cout << "The firt out element is " << tst.first_out() << endl;
    cout << "The last out element is " << tst.last_out() << endl;
    return 0;

我的问题非常简单。这是如何实现队列的?我能理解它,因为队列只是值的生成器/迭代器吗?为什么要使用队列代替数组呢?圈队列的重点是什么?

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

至少在C和C ++中,数组是用具体的术语定义的。具体来说,它是根据内存布局定义的 - 连续内存位置的对象。你如何使用它,你用它做什么等等,完全取决于这个定义。

更抽象地定义队列:它必须支持几个特定的​​操作(添加和检索项)以及两者之间的顺序关系(先进先出)。还经常提供一些辅助操作,例如检查队列是否为空,或检查其当前大小(但通常不会将其视为定义的一部分)。

您当然可以使用数组来实现队列。您还可以使用链接列表。虽然它可能没有多大意义,但还可以使用二叉树,多路树,混合(如数组的链接列表),或者基本上你可以想到的任何其他东西,只要它支持所需的操作。

走向另一个方向,您可以使用数组不仅实现队列,还可以实现堆栈,双端队列,堆/优先级队列,循环缓冲区或任意数量的其他抽象。

关于你的具体问题:&#34;这是如何实现队列&#34;?我一般说不,不。举一个例子,你忽略了三巨头的法则,因此分配,复制和破坏对你的队列并不起作用(但你也没有阻止任务或复制)。您还使用new[]来分配队列的空间,该空间在分配时立即将对象构建到该空间中。这对于像int这样的原始对象的队列来说很好,但总的来说不是很好。同样,您的队列可以打印出一条消息以响应isEmpty()。假设它完全存在,isEmpty应该只返回一个值来指示队列是否为空 - 如果需要打印的消息,应由其他代码处理。