快速掌握队列的基础知识

news2024/11/16 11:49:29

目录

    • 队列的特点
    • 基于链表实现队列
    • 用栈实现队列
    • 用队列实现栈

队列是一种线性数据结构,它只允许在一边进行插入操作(队尾),另一边进行删除操作(队头)。插入操作称为入队,删除操作称为出队。队列遵循先进先出(FIFO)的原则,即队头的元素最先被删除,队尾的元素最后被删除。

在这里插入图片描述

队列的特点

  1. 先进先出:队列中的元素按照其进入队列的顺序被取出,即先进入队列的元素将先被取出。
  2. 有限容量:队列通常具有一定的最大容量,当队列达到最大容量时,新的元素将无法进入队列。
  3. 基本操作:队列支持插入(入队)和删除(出队)两种基本操作,其中插入操作在队列的尾部进行,删除操作在队列的头部进行。

基于链表实现队列

这种实现方式比较简单,具体如下:

public class LinkQueue {
    // 头节点
    private  Node front;
    //尾节点
    private Node rear;
    //队列大小
    private int size;
    public LinkQueue(){
        //初始化头节点和尾节点
        this.front = new Node(0);
        this.rear = new Node(0);
    }
    /**
     *入队
     */
    public  void push(int value){
     //创建新节点
     Node newNode = new Node(value);
      //临时节点指向头节点
      Node temp = front;
      //循环遍历,直到临时节点指向尾节点
      while (temp.next!=null){
          temp = temp.next;
      }
      //将新节点指向头节点
      temp.next = newNode;
      //将尾节点指向新节点
      rear = newNode;
      //队列大小加1
      size++;
    }
    /**
     * 出队
     */
    public int pull(){
       //如果队列为空,则提示
       if(front.next==null){
           System.out.println("队列已经为空!");
       }
       //获取头节点指向的节点
       Node fristNode = front.next;
       //将头节点指向头节点指向的节点的下一个节点
       front.next = fristNode.next;
       //队列大小减1
       size--;
       //返回头节点指向的节点
       return fristNode.data;
    }
    /**
     * 遍历队列
     */
    public  void  traverse(){
       //临时节点指向头节点指向的节点
       Node temp = front.next;
       //循环遍历,直到临时节点指向尾节点
       while (temp!=null){
           //输出临时节点指向的节点
           System.out.printf(temp.data+"\t");
           //将临时节点指向临时节点指向的节点的下一个节点
           temp = temp.next;
       }
    }
   //测试方法
    public static void main(String[] args) {
     //创建一个队列
     LinkQueue linkQueue = new LinkQueue();
     //将1,2,3入队
     linkQueue.push(1);
     linkQueue.push(2);
     linkQueue.push(3);
        //输出第一个出队的元素
        System.out.println("第一个出队的元素为"+linkQueue.pull());
        //输出队列中的元素
        System.out.println("队列中的元素为");
        linkQueue.traverse();

    }

}
class Node{
    //节点数据
    public  int data;
    //指向下一个节点
    public Node next;
    //构造函数
    public Node(int data){
        this.data = data;
    }
}

首先,定义了一个Node类来表示队列中的节点。每个节点包含一个数据项和一个指向下一个节点的指针。
在LinkQueue类中,定义了三个私有属性:front表示队列的头节点,rear表示队列的尾节点,size表示队列的大小。
构造函数LinkQueue()用来初始化队列,它创建一个头节点和一个尾节点,并使它们的值都为0。
push()方法用于入队操作,即向队列中添加元素。它首先创建一个新的节点,然后通过一个临时节点遍历队列,直到找到队尾节点,将新节点链接至队尾,并更新rear指针指向新的队尾节点。最后,将队列大小加1。
pull()方法用于出队操作,即从队列中取出元素。首先检查队列是否为空,如果为空则提示队列已经为空。然后从队列头部取出节点,更新front指向下一个节点,并将队列大小减1。最后返回被取出节点的值。
traverse()方法用于遍历队列,打印出队列中的所有元素。

用栈实现队列

用队列实现栈在许多题中会遇到,例如力扣232题:

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

这道题我们的实现思路就是用两个栈,一个输入栈,一个输出栈,数据输入都会压入输入栈中,当数据输出时,会从输出栈中出栈,当输出栈中为空时我们需要把输入栈中的数据全部出栈,然后压入输出栈中。具体代码示例如下:

class MyQueue {
  Deque<Integer> inStack = null;
  Deque<Integer> outStack = null;
    public MyQueue() {
     inStack = new LinkedList<>();
     outStack = new LinkedList<>();
    }
    
    public void push(int x) {
      inStack.push(x);
    }
    
    public int pop() {
     if(outStack.isEmpty()){
         in2out();
     }
     return outStack.pop();
    }
    
    public int peek() {
    if(outStack.isEmpty()){
        in2out();
    }
    return outStack.peek();
    }
    
    public boolean empty() {
    return inStack.isEmpty()&&outStack.isEmpty();
    }
    public void in2out(){
        while (!inStack.isEmpty()){
            outStack.push(inStack.pop());
        }
    }
}

用队列实现栈

我们来看力扣225题:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

这道题我们的实现思路就是用两个队列,我们需要把刚压入的元素放入队列前端以方便出栈的顺序刚好是后进先出,所以我们用队列2辅助队列1进行操作,我们把入栈操作的元素先放到队列2中,然后把队列1中的元素全部出队放入队列2中,然后再把队列1与队列2相互交换,则队列1中的元素即为栈中的元素。

class MyStack {
   Queue<Integer> queue1 = null;
   Queue<Integer> queue2 = null;
    public MyStack() {
  queue1 = new LinkedList<>();
  queue2 = new LinkedList<>();
    }
    
    public void push(int x) {
     //将元素x压入队列2
     queue2.offer(x);
     //将队列1中的元素压入队列2,并将其弹出
     while (!queue1.isEmpty()){
         queue2.offer(queue1.poll());
     }
     //交换队列1和队列2
     Queue<Integer> temp = queue1;
     queue1 = queue2;
     queue2 = temp;
    }
    
    public int pop() {
      //从队列1中弹出元素
      return   queue1.poll();
    }
    
    public int top() {
      //返回队列1的第一个元素
      return queue1.peek();
    }
    
    public boolean empty() {
   //判断队列1是否为空
   return queue1.isEmpty();
    }
}

队列是一种重要的数据结构,它具有“先进先出”的特点,常用于按顺序存储和访问数据。理解队列的基本概念、特点和常见操作对于计算机科学领域的学习和工作都非常重要。在实际应用中,队列有着广泛的用途,包括网络传输、操作系统、任务队列和打印队列等方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1205747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络奇缘】我和英特网再续前缘

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络的概念 计算机网络的功能 ⭐1.数据通信 ⭐2.资源共享 ⭐3.分布式处理 ⭐4.提高可靠性 ⭐…

Java17新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Eclipse打包Springboot项目

首先&#xff0c;在pom.xml文件中添加配置&#xff0c;修改mainClass主函数&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configurat…

【电路笔记】-戴维南定理(Thevenin‘s Theorem)

戴维南定理&#xff08;Thevenin’s Theorem&#xff09; 文章目录 戴维南定理&#xff08;Thevenins Theorem&#xff09;1、概述与定义2、戴维南模型确定3、一些线性电路的戴维南模型3.1 单电压源3.2 单电流源3.3 多电流/电压源 4、结论 在本文中&#xff0c;我们将介绍一种强…

LLaMA模型之中文词表的蜕变

在目前的开源模型中&#xff0c;LLaMA模型无疑是一颗闪亮的⭐️&#xff0c;但是相对于ChatGLM、BaiChuan等国产大模型&#xff0c;其对于中文的支持能力不是很理想。原版LLaMA模型的词表大小是32K&#xff0c;中文所占token是几百个左右&#xff0c;这将会导致中文的编解码效率…

Python---综合案例:通讯录管理系统---涉及点:列表、字典、死循环

需求&#xff1a; 开个一个通讯录的管理系统&#xff0c;主要用于实现存储班级中同学的信息&#xff08;姓名、年龄、电话&#xff09; 涉及点&#xff1a;列表、字典、死循环 相关链接&#xff1a;Python--列表及其应用场景---增、删、改、查。-CSDN博客 Python---字典---…

ip数据包

数据报文格式 首部 版本&#xff08;Version&#xff09; 版本字段占4bit&#xff0c;通信双方使用的版本必须一致。对于IPv4&#xff0c;字段的值是4。 首部长度&#xff08;Internet Header Length&#xff0c; IHL&#xff09; 占4bit&#xff0c;首部长度说明首部有多少…

ubutun上编译出现undefined reference to symbol ‘dladdr@@GLIBC_2.2.5‘的错误

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> ubutun上编译一段C程序&#xff0c;出现错误&#xff1a; /usr/bin/ld: /tmp/ccghh3FJ.o: undefined reference to symbol ‘dladdrGLIBC_2.2.5’ //lib/…

前端---CSS的盒模型

文章目录 什么是盒模型&#xff1f;设置边框设置内边距设置外边距块级元素水平居中 什么是盒模型&#xff1f; 页面上的每个HTML元素都是一个一个的“盒子”&#xff0c;这些盒子由&#xff1a;内容、内边距、边框、外边距组成。 我们可以和住的房子联系起来&#xff0c;更好…

HarmonyOS开发(二):TypeScript入门

1、编程语言介绍 ArkTS是HarmonyOS主推的应用开发语言&#xff0c;它是在TypeScript语言的基础之上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkTS、TypeScript和JavaScript之间…

打开 Chrome 的 「内存节省程序」开关和关闭硬件加速

不知道从什么时候开始&#xff0c;应该是最近1个月&#xff0c;感觉 Mac 浏览器总是占用很高的 CPU&#xff0c;多开一些标签页&#xff0c;或者浏览器窗口&#xff0c;相互切换时系统就会变得无响应&#xff0c;从 Chrome 浏览器里找到一个「内存节省程序」的配置&#xff0c;…

数据校验:Spring Validation

Spring Validation概述 在开发中&#xff0c;我们经常遇到参数校验的需求&#xff0c;比如用户注册的时候&#xff0c;要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式&#xff0c;我们会把校验的代码和真正的业务处理逻辑耦…

二维码智慧门牌管理系统升级解决方案:运营可视化之道

文章目录 前言一、系统概述二、数据可视化与运营决策 前言 随着科技的飞速发展和人们生活水平的提高&#xff0c;传统的门牌管理系统已经无法满足现代社会的需求。在这个信息化、智能化的时代&#xff0c;一款升级版的二维码智慧门牌管理系统应运而生&#xff0c;它将以全新的…

手机能做静态二维码吗?用手机做二维码的教程

现在手机上有很多的功能&#xff0c;能够帮助我们应对日常生活中的各种问题&#xff0c;那么如果我们想要在手机上生成一个静态二维码&#xff0c;大家知道该怎么来操作吗&#xff1f;一般制作二维码需要专业的二维码生成工具才可以完成制作&#xff0c;那么下面小编来给大家分…

properties文件乱码

出现如下乱码&#xff1a; 按照步骤修改编码方式就可以解决啦 修改之后结果就是下面这样~

【LabVIEW学习】1.对labview的初步使用,控制数据流动

一。初步使用labview 1.程序图标 2.打开之后继续点击新建VI 原因&#xff1a;最后的程序后缀就是 .vi 3.新建之后&#xff0c;会有三个界面&#xff08;没有不要紧&#xff0c;找找肯定有&#xff09; 4.程序操作方法 1.拖动控件到前面板 2.此时程序框图会出现对应的控件 拖动…

利用Python群组分析方法剖析客户行为

大家好&#xff0c;如今的企业有能力收集大量的数据&#xff0c;这些数据可以帮助企业制定更好的策略并了解其客户的行为。Cohort分析可以在其中发挥作用&#xff0c;Cohort分析是一种了解客户行为或用户互动的强大工具&#xff0c;并为企业提供有价值的见解&#xff0c;本文中…

优雅的Java编程:将接口对象作为方法参数

theme: smartblue 目录 概述 在Java编程中&#xff0c;方法的参数传递方式通常是通过基本类型、对象引用或者集合等方式。然而&#xff0c;一种更加优雅且灵活的设计模式是将接口对象作为方法的参数。这种方式为我们带来了许多好处&#xff0c;包括降低耦合性、实现多态性和可…

微信小程序display常用属性和子元素排列方式介绍

wxss中display常用显示属性与css一致&#xff0c;介绍如下&#xff1a; 针对元素本身显示的属性&#xff1a; displayblock&#xff0c;元素显示换行displayinline&#xff0c;元素显示换行&#xff0c;但不可设置固定的宽度和高度&#xff0c;也不可设置上下方向的margin和p…

postgreSQL中的高速缓存

1. 高速缓存简介 ​如下图所示&#xff0c;当一个postgreSQL进程读取一个元组时&#xff0c;需要获取表的基本信息&#xff08;例如&#xff1a;表的oid、索引信息和统计信息等&#xff09;及元组的模式信息&#xff0c;这些信息被分别记录在多个系统表中。通常一个表的模式信…