如何解决队列的结构和类
当我构建此代码时,它不会打印出任何内容。这段代码有什么问题,我参考了网上的一个代码,它使用了一个struct来声明队列。但我只是想使用类。使用类的对象有什么问题吗?这段代码还有哪些其他问题?
#include<bits/stdc++.h>
using namespace std;
class Queue{
public:
int front,rear,size;
unsigned capacity;
int* array;
};
Queue* createQueue(unsigned capacity){
Queue* queue = new Queue;
queue->front = queue->size = 0;
queue->capacity = capacity;
queue->rear = queue->capacity-1;
queue->array = new int[queue->capacity];
}
int isEmpty(Queue* queue){
return (queue->size==0);
}
int isFull(Queue* queue){
return (queue->size==queue->capacity);
}
void enqueue(Queue* queue,int item){
if(isFull(queue)){
return;
}else{
queue->rear = (queue->rear+1)%queue->capacity;
queue->size = queue->size+1;
queue->array[queue->rear] = item;
cout << item << " enqueued to queue\n";
}
}
int dequeue(Queue* queue){
if(isEmpty(queue)){
return NULL;
}else{
int temp = queue->array[queue->front];
queue->front = (queue->front+1)%queue->capacity;
queue->size = queue->size-1;
return temp;
}
}
int front(Queue* queue){
if(isEmpty(queue)){
return 0;
}else{
return queue->array[queue->front];
}
}
int rear(Queue* queue){
if(isEmpty(queue)){
return NULL;
}else{
return queue->array[queue->rear];
}
}
int main(){
Queue queue;
Queue* ptr = &queue;
enqueue(ptr,10);
}
解决方法
很多事情:
- 您公开了所有
Queue
类成员变量,无视整个想法的封装。 (不要将您的会员暴露给他人) - 最好不要将无符号类型用于大小或容量。无符号算术并不总是如您所愿。
- 你应该用类型封装函数。 IE。
enqueue
应该是Queue
的成员函数。 (至少如果你想使用面向对象) - 不要从谓词返回
int
。使用bool
。 -
createQueue
被定义为返回Queue*
,但是,您不返回任何内容。这是未定义的行为。 -
dequeue
可以返回NULL
。NULL
用于空指针。但该函数被定义为返回一个int
,所以这是错误的。此外,在 C++ 中,我们使用nullptr
。如果您有条件地想要返回某些内容,请使用std::optional
- 您正在处理原始指针 (
array
),但没有定义析构函数、复制/移动构造函数、复制/移动赋值运算符。所以你会有很多内存泄漏。 use the rule of five。更好:使用std::vector
。
整个事情可能看起来像(需要更多测试)
#include <vector>
#include <iostream>
#include <optional>
class Queue{
private:
int capacity;
std::vector<int> data{};
public:
Queue(int capacity)
: capacity(capacity)
{}
bool isEmpty(){
return data.size()==0;
}
bool isFull(){
return data.size()==capacity;
}
bool enqueue(int item){
if (isFull()){
return false;
} else {
data.push_back(item);
std::cout << item << " enqueued to queue\n";
return true;
}
}
std::optional<int> dequeue(){
if (isEmpty()) {
return std::nullopt;
} else {
int retval = data.front();
data.erase(data.begin());
return retval;
}
}
std::optional<int> front(){
if (isEmpty()) {
return std::nullopt;
}else{
return data.front();
}
}
std::optional<int> back(){
if (isEmpty()) {
return std::nullopt;
}else{
return data.back();
}
}
};
int main(){
Queue queue(5);
queue.enqueue(10);
std::cout << "removed from queue: " << queue.dequeue().value() << '\n';
std::cout << "Queue contains nothing: " << (queue.back().has_value() == false?"yes":"no") << '\n';
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。