首页 > 解决方案 > 动态改变队列数组的大小

问题描述

我对 C++ 相当陌生,我正在尝试实现一个队列的入队函数,如果数组已满,则创建一个新数组,其大小是旧数组容量的两倍,复制所有元素并删除旧数组。我仍然无法理解类和 C++ 的整体语法,因此任何信息都将不胜感激。

我不太了解的一些事情是,在创建两倍于初始数组大小的新数组时,使一个等于初始大小 * 2 的新整数值成为一个可行的选项(在我的入队函数中)? 当我尝试在我的新队列对象“new_queue”(在我的入队函数中)中传递 elementCount 时,它会指出一个错误:

no instance of constructor "Queue::Queue" matches the argument list 
-- argument types are: (unsigned int, int, int, unsigned int). 

elementCount 不是整数吗?为什么将它传递给我的构造函数无效?

并且使用这个新创建的对象“new_queue”,默认情况下,主函数中的用户是否仍会排队进入这个新数组,还是我必须做其他事情?我还将链接下面的主文件,如果我在这里要问的内容没有任何意义,我深表歉意。

我应该将哪些数据而不是 elementCount 传递给构造函数参数?

队列.h

class Queue {
    private:
        static unsigned const INITIAL_SIZE = 6;
        int* elements[INITIAL_SIZE];

        unsigned elementCount;  
        unsigned capacity;     
        unsigned frontindex;
        unsigned backindex;  

    public:
        // Desc:  Constructor
        Queue();


        ~Queue();

队列.cpp

// Desc:  Constructor
Queue::Queue() : elementCount(0), capacity(INITIAL_SIZE), 
frontindex(0), backindex(0) {
} // constructor

void Queue::enqueue(int x) {
    if (backindex == capacity) {
        int new_initial = INITIAL_SIZE * 2;
        Queue new_queue(elementCount, new_initial, 0, backindex+1);
        for (int i = 0; i < elementCount; i++) {
            new_queue.elements[i] = elements[i];
            //How do I delete the old array here?
        }
    }
    else {
        elementCount++;
        *elements[backindex] = x;
        backindex = (backindex + 1) % capacity;
    }
} // enqueue


int main () {
    Queue Q;

    // enqueue 1, 2, 3, 4, 5
    for (int i = 1; i <= 5; i++) {
        Q.enqueue(i);
        cout << "enqueue " << i << endl;
    }
    // dequeue 2x elements
    for (int i = 0; i < 2; i++) {
        int y = Q.peek();
        Q.dequeue();
        cout << "peek " << y << endl;
    }
    // enqueue 6, 7, 8, 9, 10
    for (int i = 6; i <= 10; i++) {
        Q.enqueue(i);
        cout << "enqueue " << i << endl;
    }
    // dequeue all elements
    while (!Q.isEmpty()) {
        int y = Q.peek();
        Q.dequeue();
        cout << "peek " << y << endl;
    }
    return 0;
}

我将非常感谢我可以开始实施的任何反馈和更改,以避免不良做法。谢谢大家,这是我在stackoverflow上的第一篇文章,如果我的文章难以理解,我深表歉意。

标签: c++classqueue

解决方案


推荐阅读