如何解决在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();
将导致编译错误,因为未定义默认构造函数,而在类Queue
中定义了另一个构造函数。
要解决此问题,您应该执行以下一项操作:
- 更改此行以匹配定义的构造函数,例如
Queue* queue=new Queue(1024);
- 将默认构造函数添加到类
Queue
- 为类
c
的构造函数添加参数Queue
的默认值,例如Queue(int c = 1024)
第二,函数dequeue
具有执行路径,在该路径中,执行到达功能的结尾而不执行任何return
语句。
似乎应该在函数末尾添加return x;
。
第三行
int *arr= new int[c*sizeof(int)];
不好是因为:
- 这将存储指向局部变量的指针,该指针将在此构造方法的末尾消失,而不是成员变量。
- 您不需要乘以
sizeof(int)
,因为要指定的是要分配的元素数,而不是字节数。
该行应为
arr= new int[c];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。