繁体   English   中英

在C++中使用Arrays实现Queue

[英]Implementation of Queue using Arrays in C++

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

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

#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 like Queue(int c = 1024)的构造函数添加参数c的默认值

其次,function dequeue有一个执行路径,执行到funciton的末尾,不执行任何return语句。

好像return x; 应添加在 function 的末尾。

三、线路

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

不好是因为:

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

该行应该是

arr= new int[c];

暂无
暂无

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

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