队列有几种实现方式?

队列有3种实现方式,分别为:1、基于链表来实现队列;2、使用linkedList来实现队列;3、使用两个栈来实现一个队列。

队列有几种实现方式?

队列有3种实现方式,实现方式为:

1、基于链表来实现队列:

首先添加一个节点类,作为队列中的节点元素

public class Node {//链表中的一个节点Node next = null;int data;//构造函数,用于添加链表时候使用public Node(int d) {this.data = d;};}

登录后复制

再新建一个类作为我们的队列,在该类中实现队列的入队和出队以及求队列的长度和判断队列是否为空等方法

①入队操作:

             首先通过函数参数传入要入队的数据,根据传入的参数,新增一个节点Node,在入队方法中判断该队列是否为空,若该队列为空(head==tail),则该入队的节点既是队头也是队尾。若队列不为空,则将尾节点tail的next指针指向该元素,然后将tail节点指向该节点。

public void put(Integer data) {Node newNode = new Node(data);//构造一个新节点if(head == null && tail == null) {//队列为空head = newNode;tail = newNode;}else {tail.next = newNode;tail = newNode;}}

登录后复制

②出队操作:

若队列为空,则返回空。若队列不为空,则返回该队列的头结点,然后将头结点的下一个元素重新作为头节点

public Integer pop() {if(this.isEmpty()) {return null;}int data = head.data;head = head.next;return data;}

登录后复制

③判断队列空和对列长度很简单,直接贴代码,不再多说。

public int size() {int count = 0;Node tmp = head;while(tmp != null) {count++;tmp = tmp.next;}return count;}

登录后复制

④详细代码实现:

package com.wp.datastruct; /** * 利用链表来实现队列 * */public class MyQueue {Node head = null;//队列头Node tail = null;//队列尾/*** 入队操作:* 若该队列尾空,则入队节点既是头结点也是尾节点* 若队列不为空,则先用tail节点的next指针指向该节点* 然后将tail节点指向该节点* */public void put(Integer data) {Node newNode = new Node(data);//构造一个新节点if(head == null && tail == null) {//队列为空head = newNode;tail = newNode;}else {tail.next = newNode;tail = newNode;}}/*** 判断队列是否为空:当头结点等于尾节点的时候该队列就为空* */public boolean isEmpty() {return head == tail;}/*** 出队操作:* 若队列为空,则返回null* 否则,返回队列的头结点,并将head节点指向下一个* */public Integer pop() {if(this.isEmpty()) {return null;}int data = head.data;head = head.next;return data;}public int size() {int count = 0;Node tmp = head;while(tmp != null) {count++;tmp = tmp.next;}return count;} }

登录后复制

2、使用linkedList来实现队列

该方法是使用java中的linkedList集合来实现一个队列,通过调用linkedList中的方法来实现队列的入队出队,判空等操作

首先new一个类来作为我们的队列,该类中包含两个属性,一个是size:用来统计该队列的长度,另一个是LinkedList对象,

代表我们的队列。

private LinkedList list = new LinkedList();private int size = 0;//用于统计队列的长度

登录后复制

①入队操作:

应为linkedList集合中已经实现好了添加删除操作,在这里我们只需要简单的调用方法就可以实现队列的相关操作了,非常简单而且容易理解。

public synchronized void put(E data) {//保证线程安全,实现同步操作list.add(data);size++;}

登录后复制

②出队操作:

public synchronized E pop() {size--;return list.removeFirst();//从头取出}

登录后复制

③详细代码:

public class MyQueue2 {private LinkedList list = new LinkedList();private int size = 0;//用于统计队列的长度public synchronized void put(E data) {//保证线程安全,实现同步操作list.add(data);size++;}public synchronized E pop() {size--;return list.removeFirst();//从头取出}public synchronized int size() {return size;}public boolean isEmpty() {return size == 0;}}

登录后复制

 

3、使用两个栈来实现一个队列。

也可以使用两个实现好的栈来实现一个队列(这个问题可能面试笔试的时候回被问到)。

实现方法是:

创建两个栈s1,s2。入队的时候就只压栈到s1中。

出队分两种情况:1.当s2不为空的使用,就弹出栈顶元素作为出队元素。

                             2.当s2等于空,则先将s1中的元素全部弹出到s2中,再从s2中弹出栈顶元素作为出队元素。

 

①入队:

public synchronized void put(E data) {//使用同步处理,保证线程安全s1.push(data);}

登录后复制

②出队:

public synchronized E pop() {if(!s2.isEmpty()) {return s2.pop();}else {s2.push(s1.pop());return s2.pop();}}

登录后复制

③.详细代码实现:

package com.wp.datastruct; import java.util.Stack; /** * 利用两个栈来模拟队列操作 * 入队操作就只是想栈s1中添加, * 出栈操作分为两部分: * 1.当s2中不为空的时候,就直接弹出s2中的栈顶数据 * 2.当s2中为空的时候,就先把s1中的数据全部弹出到s2中然后将栈顶数据出栈 *  * */public class MyQueue3 {Stack s1 = new Stack();Stack s2 = new Stack();public synchronized void put(E data) {//使用同步处理,保证线程安全s1.push(data);}public synchronized E pop() {if(!s2.isEmpty()) {return s2.pop();}else {s2.push(s1.pop());return s2.pop();}}public synchronized boolean isEmpty() {return s1.isEmpty() && s2.empty();}}

登录后复制

 推荐教程:《php视频教程》

以上就是队列有几种实现方式?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2137713.html

(0)
上一篇 2025年2月25日 01:09:53
下一篇 2025年2月23日 04:15:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php怎么实现自动收货

    php实现自动收货的方法:1、通过linux的定时任务把即将要确认收货的订单信息查询出来;2、将订单信息存储在redis上;3、执行相应脚本即可。 本文操作环境:linux5.9.8系统、PHP7.1版,DELL G3电脑 php怎么实现自…

    2025年2月24日
    200
  • 解析Java缓存机制:常见实现方式及其优劣评析

    Java缓存机制解析:常见的几种实现方式及其优缺点 缓存是一种常见的优化手段,能够提升系统的性能和响应速度。在Java开发中,缓存机制的使用非常广泛,它通过将数据存储在高速缓存中,避免了频繁的数据查询和计算,从而加快了系统的访问速度。本文将…

    2025年2月24日
    200
  • golang的框架如何提升对队列的性能?

    golang 框架使用 redis 或 apache kafka 提升队列性能:redis 作为队列:使用 redis 库进行交互,提供持久化、高吞吐量和低延迟。apache kafka 作为队列:使用 kafka-go 库进行交互,提供分…

    2025年2月24日
    200
  • Redis实现分布式限流的原理和实现方式

    随着互联网的发展,许多应用程序需要对各种请求进行限流。这是因为在高并发的情况下,应用程序会遭受大量请求的压力,导致服务崩溃或响应变慢。为了解决这个问题,开发者们通常会使用分布式限流技术来控制请求的流量,保证服务的高可用性和稳定性。而redi…

    数据库 2025年2月23日
    200
  • Redis实现分布式锁的原理和实现方式

    随着分布式系统的普及,分布式锁变得越来越重要。分布式锁是一种保证在分布式系统中同时只能有一个进程或者线程进行操作的机制。在许多分布式环境下的应用程序中,分布式锁是一个非常常见的问题。redis是一个高性能的支持多种数据结构的内存数据库,在分…

    数据库 2025年2月23日
    200
  • Redis如何实现分布式搜索功能

    Redis是一款高性能的NoSQL数据库,其提供了丰富的功能和数据结构,包括字符串、哈希表、列表、集合和有序集合等。除此之外,Redis还提供了一些高级功能,例如发布订阅、Lua脚本和事务等。其中,Redis的分布式搜索功能非常实用,可以帮…

    2025年2月23日
    200
  • PHP7.0中的协程技术有哪些实现方式?

    随着互联网应用的不断发展,php语言的使用越来越广泛,而协程技术则成为了提高系统性能的重要工具之一。php7.0中引入了协程技术,本文将介绍php7.0中协程技术的实现方式。 什么是协程? 协程是一种轻量级的用户线程,由用户自行控制调度。相…

    编程技术 2025年2月23日
    200
  • PHP7.0中的容器化部署有哪些实现方式?

    php7.0中的容器化部署有哪些实现方式? 随着云计算和大数据时代的来临,容器技术也逐渐流行起来。在过去,部署PHP应用程序通常需要在服务器上安装Apache,MySQL和PHP,然后手动配置它们。但是,这种方式很容易出现版本冲突,不兼容等…

    编程技术 2025年2月23日
    200
  • PHP7.0中的微服务架构有哪些实现方式?

    随着互联网的发展,越来越多的企业开始采用微服务架构来构建其基础架构,使得其应用更加灵活和可维护。而php7.0是众所周知的一款著名的编程语言,它也可以用来构建微服务。 那么,php7.0中的微服务架构有哪些实现方式呢?让我们来深入了解。 一…

    编程技术 2025年2月23日
    200
  • PHP7.0中的非阻塞IO有哪些实现方式?

    php7.0是一种流行的编程语言,在web开发和服务端开发领域都有广泛的应用。其中一个重要的更新就是引入了非阻塞i/o。非阻塞i/o是一种异步编程技术,它可以在不阻塞当前线程的情况下,同时处理多个i/o操作。这种技术极大地提高了并发性能和响…

    编程技术 2025年2月23日
    200

发表回复

登录后才能评论