首页 > 解决方案 > 队列的结构和类

问题描述

当我构建此代码时,它不会打印出任何内容。这段代码有什么问题,我参考了网上的一段代码,它使用了一个结构来声明队列。但我只是想使用类。使用类的对象有什么问题吗?这段代码还有哪些其他问题?

#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);
    }

标签: c++algorithmdata-structuresqueue

解决方案


很多东西:

  • 你暴露了所有的Queue类成员变量,违背了整个想法的封装。(不要将您的会员暴露给其他人)
  • 最好不要对大小或容量使用无符号类型。无符号算术并不总是按照您期望的方式运行。
  • 您应该使用类型封装函数。即enqueue应该是 的成员函数Queue。(至少如果你想使用 OO)
  • 不要int从谓词返回。使用bool.
  • createQueue定义为 return Queue*,但是,您不返回任何内容。那是未定义的行为。
  • dequeue可以返回NULLNULL用于空指针。但是该函数被定义为返回一个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';
}

推荐阅读