首页 > 其他分享 >队列

队列

时间:2023-12-20 20:46:41浏览次数:34  
标签:obj 队列 int isEmpty return public

1. 队列概念及结构

队列一种先进先出的数据结构, 先入队列的数据先出队列

单链表能实现队列 ?

所以以原来的单链表无法用来实现队列, 如何修改 ?

只需再加个last引用指向尾,这样尾插入队操作复杂度就能达到O(1)

但是需要注意:

这种结构的单链表只能头插实现出队 尾插实现入队, 不能头插实现入队 尾插实现出队

因为单链表的尾删需要找到删除节点的前一个,需要遍历链表复杂度O(N)

双向链表能实现队列 ?

无论是头删出队 尾插入队,头插入队尾删出队都可以实现队列 

双向链表实现队列:

https://github.com/znxcmakhsd/DS/tree/main/12-20/MyQueue

2. 设计循环队列

数组是否可以用来实现队列 ?

答:  数组不仅可以用来实现普通队列还可以用来实现循环队列

 

 

以上是解这道题的重点,关于入队出队操作可以参考下面代码

class MyCircularQueue {

    private int[] elem;
    private int front; // 指向队头
    private int rear;  // 指向队尾

    // k = 有效数据 不考虑用来判空满的空间
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];
        this.front = 0;
        this.rear = 0;
    }

    public boolean enQueue(int value) {
        // 满了不能入队
        if (isFull()) {
            return false;
        }
        this.elem[rear] = value;
        rear = (rear + 1) % elem.length;
        return true;
    }

    public boolean deQueue() {
        // 空了不能出队
        if (isEmpty()) {
            return false;
        }
        this.front = (front + 1) % elem.length;
        return true;
    }

    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return this.elem[front];
    }

    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

    public boolean isEmpty() {
        return rear == front;
    }

    public boolean isFull() {
        return (rear + 1) % elem.length == front;
    }
}

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue obj = new MyCircularQueue(k);
 * boolean param_1 = obj.enQueue(value);
 * boolean param_2 = obj.deQueue();
 * int param_3 = obj.Front();
 * int param_4 = obj.Rear();
 * boolean param_5 = obj.isEmpty();
 * boolean param_6 = obj.isFull();
 */

3. 用队列实现栈

 



// 队列实现栈
class MyStack {
    public Queue<Integer> queueA;
    public Queue<Integer> queueB;

    public MyStack() {
        queueA = new LinkedList<>();
        queueB = new LinkedList<>();
    }

    public void push(int x) {
        // 如果两个队列都为空入QueueA
        if (empty()) {
            queueA.offer(x);
            return;
        }
        // 入不为空的队列
        if (!queueA.isEmpty()) {
            queueA.offer(x);
        }else {
            queueB.offer(x);
        }
    }

    public int pop() {
        int tmp = -1;
        if (!queueA.isEmpty()) {
            int n = queueA.size();
            for (int i = 0;i < n - 1;i++) {
                queueB.offer(queueA.poll());
            }
            tmp = queueA.poll();
        }else {
            int n = queueB.size();
            for (int i = 0;i < n - 1;i++) {
                queueA.offer(queueB.poll());
            }
            tmp = queueB.poll();

        }
        return tmp;
    }

    public int top() {
        int tmp = -1;
        if (!queueA.isEmpty()) {
            int n = queueA.size();
            for (int i = 0;i < n;i++) {
                tmp = queueA.poll();
                queueB.offer(tmp);
            }
        }else {
            int n = queueB.size();
            for (int i = 0;i < n;i++) {
                tmp = queueB.poll();
                queueA.offer(tmp);
            }
        }
        return tmp;
    }

    public boolean empty() {
        return queueA.isEmpty() && queueB.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

4. 用栈实现队列

 


class MyQueue {
    private Stack<Integer> pushst;
    private Stack<Integer> popst;

    public MyQueue() {
        pushst = new Stack<>();
        popst = new Stack<>();
    }

    public void push(int x) {
        pushst.push(x);
    }

    public int pop() {
        if (empty()) {
            return -1;
        }
        if (popst.isEmpty()) {
            while (!pushst.isEmpty()) {
                popst.push(pushst.pop());
            }
        }
        return popst.pop();
    }

    public int peek() {
        if (empty()) {
            return -1;
        }
        if (popst.isEmpty()) {
            while (!pushst.isEmpty()) {
                popst.push(pushst.pop());
            }
        }
        return popst.peek();
    }

    public boolean empty() {
        return pushst.isEmpty() && popst.isEmpty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

 

标签:obj,队列,int,isEmpty,return,public
From: https://www.cnblogs.com/xumu7/p/17915325.html

相关文章

  • 等待队列
    等待队列什么是等待队列等待队列是内核实现阻塞和唤醒的内核机制。等待队列以循环链表为基础结构,链表头和链表项分别为等待队列头和等待队列元素。整个等待队列由等待队列头进行管理。等待队列头使用结构体wait_queue_head_t来表示,等待队列头就是一个等待队列的头部,这个结构......
  • Netty使用CompletableFuture实现异步串行队列
    一、前言CompletableFuture是JDK1.8提供的一种更加强大的异步编程的api。它实现了Future接口,也就是Future的功能特性CompletableFuture也有。它也实现了CompletionStage接口,CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。CompletableFuture相比于Futu......
  • 数据结构 —— 线性表、栈、队列
    一、算法复杂度 【2011】设n是描述问题规模的非负整数,下面的程序片段时间复杂度是()x=2;while(x<n/2)x=2*x;AO(log2(n))  BO(n) CO(nlog2(n)) DO(n^2) 答案:A解析:x=2^i=n/2i=log2(n/2) 【2012】求整数n(n>=0)的阶乘的算法......
  • 消息队列
    首先使用消息队列前,我们需要知道,消息队列是用来发送、接收数据的一个容器,简单的说:我们在某宝上买东西,这中间有一个快递的过程,而大多数情况下,我本人选择将我买的东西寄到某个代收点,派送员只需要按照我的要求将东西放到代收点就可以了,之后我有时间了才自己去取。消息队列就类似于这......
  • 一文讲透消息队列RocketMQ实现消费幂等
    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等。1基础概念消费幂等是指:当出现RocketMQ消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响。例如,在支付场景下,消费者消费扣款消息,对一笔订单......
  • 消息队列和事件循环
    每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。但并不......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 记录rabbitMQ的广播队列的错误使用导致未能正确广播的问题
    背景说明:有3个服务S1、S2、S3现在服务S1需要发布消息到广播交换机E,并建立了两个普通队列Q1,Q2,将其绑定到广播交换机E上服务S2和服务S3同时监听队列Q1,Q2本意是,服务S1通过广播交换机E把消息同时推送给服务S2和S3后面测试时,同事发现,服务S2和服务S3都只接收到了部分消息,而不是全......
  • 清空ActiveMQ中的Scheduled延时队列
    要清空ActiveMQ中的Scheduled延时队列,可以执行以下步骤:停止ActiveMQ服务器。在ActiveMQ数据存储目录中找到存储延时消息的目录。该目录的默认位置是<activemq_home>/data/localhost/Scheduled.删除该目录下的所有文件,这将清空延时队列中的消息。启动ActiveMQ服务器。请注意......
  • Java中的消息队列(MQ)应用实践
    摘要:本文将介绍Java中消息队列(MQ)的概念、应用场景以及如何使用Java中的消息队列进行实践。我们将探讨如何使用Java消息队列实现异步通信、解耦和流量削峰等常见需求,并通过实际案例展示其应用。一、引言在分布式系统中,消息队列(MQ)是一种常见的中间件技术,用于实现异步通信和解耦。通过......