【问题标题】:Queue implemented with classes用类实现的队列
【发布时间】:2016-03-10 16:16:23
【问题描述】:

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


【解决方案1】:

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

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

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

另一方面,您可以使用数组来实现队列,还可以实现堆栈、双端队列、堆/优先级队列、循环缓冲区或任何数量的其他抽象。

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

【讨论】:

  • 很好的答案,当我可以看到如何正确制作时,是否有任何示例或教程?到目前为止,我只使用 STL 库找到它
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 2016-01-02
  • 2021-01-06
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2019-06-21
  • 2015-10-03
相关资源
最近更新 更多