c++ - 队列的结构和类
问题描述
当我构建此代码时,它不会打印出任何内容。这段代码有什么问题,我参考了网上的一段代码,它使用了一个结构来声明队列。但我只是想使用类。使用类的对象有什么问题吗?这段代码还有哪些其他问题?
#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
类成员变量,违背了整个想法的封装。(不要将您的会员暴露给其他人) - 最好不要对大小或容量使用无符号类型。无符号算术并不总是按照您期望的方式运行。
- 您应该使用类型封装函数。即
enqueue
应该是 的成员函数Queue
。(至少如果你想使用 OO) - 不要
int
从谓词返回。使用bool
. createQueue
定义为 returnQueue*
,但是,您不返回任何内容。那是未定义的行为。dequeue
可以返回NULL
。NULL
用于空指针。但是该函数被定义为返回一个int
,所以这是错误的。此外,在 C++ 中,我们使用nullptr
. 如果您有条件地想要返回一些东西,请使用std::optional
- 您正在处理原始指针 (
array
),但没有定义析构函数、复制/移动构造函数、复制/移动赋值运算符。所以你会有很多内存泄漏。使用五法则。更好的:使用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';
}
推荐阅读
- ruby - 我想用 ruby 语言对 GoogleSpreadsheet 工作表进行排序
- node.js - 在使用 Node/React 验证 socket.io 连接时,您在哪里以及如何生成 JWT 令牌?
- samba - 打开的文件太多 SMB / NextCloud
- python - 验证准确度卡住,准确度低
- c# - 如何在 c# mvc 中将值从 UI 绑定到具有复杂模型的控制器
- string - 使用powershell从文件中提取值
- python - 使用 Python selenium 登录知乎
- google-kubernetes-engine - 如何在具有默认 istio beta 功能的 GKE 中安装带有 prometheus 的 Kiali Dashboard?
- java - 如何将所有百里香输入字段转换为大写?
- azure-devops - YAML 发布到环境,部署后条件