首页 > 其他分享 >队列的具体实现方式

队列的具体实现方式

时间:2023-07-19 15:00:50浏览次数:38  
标签:方式 队列 int 具体 链式 front rear 指针

队列可以通过两种常见的实现方式来表示:顺序队列(数组实现)和链式队列(链表实现)。这两种方式在计算机科学中都广泛使用,每种实现方式都有其优势和适用场景。

1. 顺序队列(数组实现):

顺序队列是使用数组来表示队列的一种实现方式。在顺序队列中,我们使用一个固定大小的数组来存储队列的元素,并使用两个指针 frontrear 来标记队列的头部和尾部。

  • front:指向队列头部的指针,用于出队操作,即删除队列头部元素。
  • rear:指向队列尾部的指针,用于入队操作,即添加新元素到队列尾部。

入队操作:将新元素添加到 rear 指针所指向的位置,并将 rear 指针向后移动一位。若 rear 指针已达到数组的末尾,则说明队列已满,无法再添加新元素。

出队操作:将 front 指针所指向的元素从队列中移除,并将 front 指针向后移动一位。若 front 指针已追上 rear 指针,则说明队列为空,无法继续出队操作。

顺序队列的优点是简单、快速,可以直接通过数组索引访问元素,不需要额外的内存分配。但是由于数组大小固定,可能会导致队列溢出(队列已满无法再添加元素)的问题。

2. 链式队列(链表实现):

链式队列是使用链表来表示队列的一种实现方式。在链式队列中,我们使用链表来动态地存储队列的元素。

每个节点包含一个元素和一个指向下一个节点的指针。链式队列不会有固定大小的限制,可以根据需要动态地分配内存。

入队操作:将新元素添加到链表的尾部,并更新尾部指针,指向新节点。

出队操作:将链表的头部节点移除,并更新头部指针,指向下一个节点。

链式队列的优点是可以灵活地添加和删除元素,避免了队列溢出的问题。但是相比于顺序队列,链式队列可能会占用更多的内存,因为每个节点需要额外的指针来指向下一个节点。

选择实现方式:

选择队列的实现方式取决于具体的应用场景和需求。如果知道队列的最大容量,并且需要高效地进行入队和出队操作,那么顺序队列可能是更好的选择。但是如果需要动态地添加和删除元素,并且对空间的利用更加灵活,那么链式队列可能是更好的选择。

在实际应用中,如果预估队列的大小并且不会频繁发生扩容,顺序队列可能是更有效的选择。如果队列大小不可预估,或者需要频繁添加和删除元素,链式队列可能更合适。

1. 顺序队列(数组实现)的具体例子:

#include <iostream>

class Queue {
private:
    int capacity;
    int* queue;
    int front;
    int rear;
    int size;

public:
    Queue(int capacity) {
        this->capacity = capacity;
        queue = new int[capacity];
        front = 0;
        rear = -1;
        size = 0;
    }

    bool is_empty() {
        return size == 0;
    }

    bool is_full() {
        return size == capacity;
    }

    void enqueue(int item) {
        if (is_full()) {
            std::cout << "Queue is full. Cannot enqueue." << std::endl;
            return;
        }
        rear = (rear + 1) % capacity;
        queue[rear] = item;
        size++;
    }

    int dequeue() {
        if (is_empty()) {
            std::cout << "Queue is empty. Cannot dequeue." << std::endl;
            return -1;
        }
        int item = queue[front];
        front = (front + 1) % capacity;
        size--;
        return item;
    }

    ~Queue() {
        delete[] queue;
    }
};

// 创建一个容量为5的顺序队列,并进行入队和出队操作
int main() {
    Queue queue(5);
    queue.enqueue(10);
    queue.enqueue(20);
    queue.enqueue(30);
    std::cout << queue.dequeue() << std::endl;  // Output: 10
    std::cout << queue.dequeue() << std::endl;  // Output: 20
    queue.enqueue(40);
    queue.enqueue(50);

    return 0;
}

2. 链式队列(链表实现)的具体例子:

#include <iostream>

class QueueNode {
public:
    int data;
    QueueNode* next;

    QueueNode(int data) {
        this->data = data;
        next = nullptr;
    }
};

class Queue {
private:
    QueueNode* front;
    QueueNode* rear;
    int size;

public:
    Queue() {
        front = nullptr;
        rear = nullptr;
        size = 0;
    }

    bool is_empty() {
        return size == 0;
    }

    void enqueue(int item) {
        QueueNode* newNode = new QueueNode(item);
        if (is_empty()) {
            front = rear = newNode;
        } else {
            rear->next = newNode;
            rear = newNode;
        }
        size++;
    }

    int dequeue() {
        if (is_empty()) {
            std::cout << "Queue is empty. Cannot dequeue." << std::endl;
            return -1;
        }
        int item = front->data;
        QueueNode* temp = front;
        front = front->next;
        delete temp;
        size--;
        return item;
    }

    ~Queue() {
        while (front != nullptr) {
            QueueNode* temp = front;
            front = front->next;
            delete temp;
        }
    }
};

// 创建一个链式队列,并进行入队和出队操作
int main() {
    Queue queue;
    queue.enqueue(10);
    queue.enqueue(20);
    queue.enqueue(30);
    std::cout << queue.dequeue() << std::endl;  // Output: 10
    std::cout << queue.dequeue() << std::endl;  // Output: 20
    queue.enqueue(40);
    queue.enqueue(50);

    return 0;
}

标签:方式,队列,int,具体,链式,front,rear,指针
From: https://www.cnblogs.com/keep--fighting/p/17565591.html

相关文章

  • 解决直播间源码音视频不同步问题的有效方式
     随着网络技术的发展和移动设备的普及,电视、电脑、手机等数码产品越来越智能,我们不管是在家或是在外面都可以运用不同的数码产品去看剧或是短视频等,但可能很多人遇到过这样一种情况:当我们在看剧或是短视频的时候,可能出现声音与画面不对等的情况,举个例子,视频画面进度到了第十分钟......
  • JSONP方式解决跨域
     <script>//封装一个jsonp函数functionjsonp({url,params,callback}){returnnewPromise((resolve,reject)=>{//定义回调函数window[callback]=function(data){resolve(data)}......
  • 反射方式读取注解信息
    packagecom.example.simpleframework.annotation;importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;importjava.lang.reflect.Method;publicclassAnnotationParse{publicstaticvoidmain(String[]args)throwsClassNotFoundExcep......
  • Go语言Revel框架 聊天室三种通讯方式分析
    三种机制的切换首页相关的网页请求路由如下:#LoginGET  /GET  /demo                 Application.EnterDemo首页显示输入昵称和三种聊天技术选择入口,选择后form提交到Application.EnterDemo页面。跳转到三种具体的聊天技术页面是通......
  • springboot下使用rabbitMQ之开发配置方式(二)
    springboot下使用rabbitMQ之传参及序列化(二)消息参数传递在开发中也是个坑,不论使用内置的SimpleMessageConverter还是Jackson2JsonMessageConverter均无法让Consumer接收动态参数一.序列化的问题首先贴出具体代码以及测试用例:消费者@RabbitListener(queues="text.q......
  • 数仓知识07:数据增量更新的几种方式
    数仓知识07:数据增量更新的几种方式1、增量更新的几种方式增量更新的本质,其实是获取源表中数据变化的情况(增、删、改),然后将源表中发生的变化同步至目标表中。不同的方式,获取源表中数据变化的情况不一样,受技术的限制、表结构的限制,某些方式可能无法获取到完整的数据变化情况,因......
  • Android使用Dagger注入的方式初始化对象的简单使用
    一.Dagger简介Dagger2是Google开源的一款依靠注入结构,它的前身是square的Dagger1,Dagger2在Android中有着较为广泛的运用。Dagger2根据Java注解,采用annotationProcessor(注解处理器)在项目编译时动态生成依靠注入需求的Java代码,然后咱们在合适的位置手动完结......
  • c++环形队列的简单实现
    环形队列可以通过维护count来间接维护tail和head指针的关系,简化程序,避免了直接使用tail和head指针,读写时head与tail回环时的比较处理,判断队列元素长度时的复杂处理,如下为不基于count而是直接使用head和tail指针比较的环形队列的实现,逻辑较为复杂uint32_tCAudioRingBuffer::Da......
  • springboot下使用rabbitMQ之开发配置方式(一)
    springboot下使用rabbitMQ之开发配置方式(一)距离上次发布博客已经小一年了,这次...嗯,没错,我又回来啦.........
  • day2 栈、队列
    功能受限的表结构:  栈:  队列:    只有两个口来进出数据,一个专门进入数据,另一个专门出数据,先进先出,FIFO表        顺序队列:      1、存储元素的连续内存的首地址      2、容量:      3、队头位置:出队......