微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

队列的结构和类

如何解决队列的结构和类

当我构建此代码时,它不会打印出任何内容。这段代码有什么问题,我参考了网上的一个代码,它使用了一个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 可以返回 NULLNULL 用于空指针。但该函数被定义为返回一个 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 举报,一经查实,本站将立刻删除。