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];
我写了这段代码,但很困惑为什么它会显示分段错误。我认为我的动态内存分配在这里给我带来了问题。谁能告诉我是什么导致了这里的分段错误以及如何改进代码。
此外,请告诉我是否可以使用 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];