C++中使用数组实现队列

Implementation of Queue using Arrays in C++

我写了这段代码,但很困惑为什么它会显示分段错误。我认为我的动态内存分配在这里给我带来了问题。谁能告诉我是什么导致了这里的分段错误以及如何改进代码。

此外,请告诉我是否可以使用 ClassName obj(); 创建对象并将其存储在堆栈而不是堆中。或者在某些问题中是否需要此实现

#include<bits/stdc++.h>
using namespace std;

class Queue
{
public:
    int rear, front, size,capacity;
    int* arr;
     
    Queue(int c)
    {
        capacity=c;
        rear=c-1;
        front=0;
        int *arr= new int[c*sizeof(int)];
    }
};


int isEmpty(Queue* queue)
{
    return (queue->size==0);
}

int isFull(Queue* queue)
{
    return (queue->size==queue->capacity);
}


void enqueue(Queue* queue, int x)
{

    if(isFull(queue))
        return;
    queue->rear=(queue->rear+1)%queue->capacity;
    queue->arr[queue->rear]=x;
    queue->size+=1;
}

int dequeue (Queue* queue)
{
    
    if(isEmpty(queue))
        return 0;
     int x = queue->arr[queue->front];
    queue->front= (queue->front+1)%queue->capacity;
   
    queue->size-=1;
}

int front (Queue* queue)
{

    if(isEmpty(queue))
        return 0;
    return queue->arr[queue->front];
}

int rear (Queue* queue)
{
    if(isEmpty(queue))
    return INT_MIN;
    return queue->arr[queue->rear];
}

int main()
{
    Queue* queue=new Queue();

    enqueue(queue,10);
    enqueue(queue,20);
    enqueue(queue,30);
    enqueue(queue,40); 
  
    cout << "Front item is "
         << front(queue) << endl; 
    cout << "Rear item is "
         << rear(queue) << endl; 
}

您的代码至少有 3 个问题:

首先,

Queue* queue=new Queue();

会导致编译错误,因为没有定义默认构造函数而在class Queue.

中定义了另一个构造函数

要解决此问题,您应该执行以下操作之一:

  • 更改此行以匹配定义的构造函数,如 Queue* queue=new Queue(1024);
  • 将默认构造函数添加到 class Queue
  • 为 class Queue 的构造函数添加参数 c 的默认值,例如 Queue(int c = 1024)

其次,函数dequeue有一个执行路径,在该路径中执行到达函数末尾而不执行任何return语句。

好像return x;应该加在函数的末尾

第三行

int *arr= new int[c*sizeof(int)];

不好,因为:

  • 这存储指向局部变量的指针,该变量将在此构造函数结束时消失,而不是成员变量。
  • 您不需要乘以 sizeof(int) 因为要指定的是要分配的元素数,而不是字节数。

该行应该是

arr= new int[c];