繁体   English   中英

用类实现的队列

[英]Queue implemented with classes

我最近来排队数据结构。 为了练习和学习新东西,我决定在没有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;

我的问题很琐碎。 这是如何实现队列? 我能理解它吗,因为队列只是值的生成器/迭代器? 为什么要使用队列而不是数组呢? 另外,圆形队列的要点是什么?

感谢您的回答。

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

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

您当然可以使用数组来实现队列。 您也可以使用链接列表。 虽然它可能没有了一大堆的道理,你也可以使用二叉树,多路树,混合如阵列,或基本的链表其他任何你能想到的,只要它支持所需的操作。

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

至于您的特定问题:“这是如何实现队列”? 我一般地说,不。 仅举一个例子,您就忽略了三巨头的法则,因此分配,复制和销毁对您的队列实际上并不起作用(但是您并未阻止分配或复制)。 您还使用了new[]来分配队列的空间,该空间在分配后立即将对象构造到该空间中。 对于像int这样的原始对象队列来说,这很好,但是通常来说并不是那么好。 同样,您的队列可以打印出一条消息以响应isEmpty() 假设它完全存在, isEmpty应该只返回一个值以指示队列是否为空-如果需要打印的消息,则应由其他代码处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM