java基础 之 集合与栈的使用(四)

news2024/9/21 14:45:28

文章目录

      • Queue
      • 栈Stack
      • 队列和栈的区别
      • 小扩展
        • 自己写个简单的队列
        • 自己写个简单的栈
        • 使用栈来实现个队列
        • 使用队列来实现个栈
        • 写在最后

前文回顾:
戳这里 → java基础 之 集合与栈的使用(一)
戳这里 → java基础 之 集合与栈的使用(二)
戳这里 → java基础 之 集合与栈的使用(三)

代码可以直接复制粘贴~

严格来说,栈不能与队列、List、Set、Map归于一类。但是平时提到队列时总少不了提到栈,所以这次就放在一起对比总结下了。

在这里插入图片描述

Queue

  • 特点

    • 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作
    • 队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队
    • 队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
    • LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
  • Queue集合的一些方法

    public static void main(String[] args) {
            Queue<String> queue = new LinkedList<>();
            // offer/add:添加;如果满了之后,offer返回false,add报异常。
            queue.add("a");
            queue.offer("abc");
            // poll/remove:删除;如果队列为空,poll返回null,remove报异常。
            System.out.println(queue.remove());
            System.out.println(queue.poll());
            // peek/element:查看头部元素;如果队列为空,peek返回null,element报异常。
            System.out.println(queue.peek());
            System.out.println(queue.element());
        }
    

    所有已知实现类:AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingQueue,LinkedList,PriorityBlockingQueue,PriorityQueue,SynchronousQueue

栈Stack

  • Stack的一些方法

    public static void main(String[] args) {
            Stack stack = new Stack();
            // 判断栈是否为空,返回值为boolean类型
            System.out.println(stack.isEmpty());
            // 将数据压入栈顶部
            stack.push(1);
            stack.push(2);
            stack.push(3);
            stack.push(4);
            // 查看栈顶部的元素,但是不从栈中移除
            System.out.println(stack.peek());  // 结果为2
            // 查看栈顶部的元素,并从栈中移除,并返回该元素
            System.out.println(stack.pop());   // 结果为2
            // 返回对象在栈中的位置,以1为技术
            System.out.println(stack.search(1));  // 结果为3
        }
    

    每次方法的调用jvm都会创建一个栈帧并压入调用栈中。大家可以思考一下递归方法与栈的联系。

队列和栈的区别

  • 存储方式:队列为先进先出[FIFO],栈为先进后出[LIFO]
  • 删除操作:队列在队头删除元素,保证了元素的顺序;栈在栈顶进行删除操作
  • 插入操作:队列在队尾插入元素;栈在栈顶进行插入操作
  • 应用场景:队列多用于按照先后顺序处理数据的场景,如任务调度,消息队列等;栈多用于后进先出的场景,如函数调用,表达式求值等
  • 数据访问方式:队列允许从队头和队尾分别访问元素,但一般只能在队头删除元素,在队尾插入元素;栈只能从栈顶访问元素

小扩展

自己写个简单的队列

在这里插入图片描述

public class MyQueue<K>{
    public K[] arr; // 定义一个泛型的数组
    private int maxSize;  // 定义数组的长度
    private int flag;  // 定义一个标签
    private int front;  // 队头索引
    private int rear;  // 队尾索引
    // 构造函数
    public MyQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = (K[]) new Object[maxSize];
        flag = 0;  // 初始时定义为0,用来标记队空
        front = -1;  // 初始队头索引
        rear = -1;  // 初始队尾索引
    }

    // 判断队空
    public boolean isEmpty(){
    	// 当队头和队尾相等时,也有可能是队满了。这时候加个标志,0说明前一个操作是出队,这样能保证当队头=队尾时,队列为空
        return front==rear && flag==0;
    }
    // 判断队满
    public boolean isFull(){
    	// front
        return (front+maxSize)%maxSize==rear && flag=1;
    }

    // 入队
    public void push(K element){
        // 先判断是否队满
        if(isFull()){
            System.out.println("入队失败,因为队满了");
            return;
        }
        rear = (rear+1)%maxSize;
        arr[rear]= element;
        flag=1;
    }

    // 出队
    public K pop(){
        // 先判断是否为空
        if(isEmpty()){
            throw new RuntimeException("出队失败,因为队空了");
        }
        front = (front+1)%maxSize;
        flag = 0;
        return arr[front];
    }
}

1、rear = (rear+1) % maxSize 每次进队后执行该操作,让队尾指向下一个,当队尾指向最后一个位置时重新到第一个位置

自己写个简单的栈

在这里插入图片描述

public class MyStack<K> {
    private K[] arr;  // 存储的数组
    private int MaxSize; // 栈的长度
    private int top;  // 栈顶

    public MyStack(int maxSize) {
        MaxSize = maxSize;
        arr = (K[]) new Object[maxSize];
        top = -1;
    }
    // 判断栈空
    public boolean isEmpty(){ return top==-1; }
    // 判断栈满
    public boolean isFull(){  return top==MaxSize-1; }
    // 入栈
    public void push(K element){
        // 先判断栈是不是满的
        if(isFull()){
            System.out.println("栈满了,无法插入");
            return;
        }
        top++;
        arr[top] = element;
    }
    // 出栈
    public K pop(){
        // 先判断是不是空的
        if(isEmpty()){
            // 这里不能返回数值,因为不确定是不是存入的数据。如果栈内数据不是Integer的时候,可以返回0或者-1;
            throw new RuntimeException("出栈失败,因为栈为空");
        }
        K temp = arr[top];
        top--;
        return temp;
    }
}
使用栈来实现个队列

戳这里→ leetcode 232:用栈实现队列

class MyQueue {
    private Stack<Integer> A;
    private Stack<Integer> B;

    public MyQueue() {
        A = new Stack();
        B = new Stack();
    }
    // 将x推到队列的末尾
    public void push(int x) {
        A.push(x);
    }
    // 从队列的开头移除并返回元素
    public int pop() {
        int peek = peek();
        B.pop();
        return peek;
    }

    // 返回队列开头的元素
    public int peek() {
        if(!B.isEmpty()){
            return B.peek();
        }
        if(A.isEmpty()){
            return -1;
        }
        while(!A.isEmpty()){
            B.push(A.pop());
        }
        return B.peek();
    }

    // 队列是否为空
    public boolean empty() {
        return A.isEmpty() && B.isEmpty();
    }
}

使用队列来实现个栈

戳这里→ leetcode 255:用队列实现栈

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    // 入栈:将数据放入队列中
    public void push(int x) {
        queue2.offer(x);
        while(!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue2;
        queue2 = queue1;
        queue1 = temp;

    }
    // 出栈:
    // 1、将queue1中除最后一个元素外,其余元素放入queue2中;
    // 2、queue中最后一个数据作为结果返回
    // 3、将queue2中的数据写回queue1
    public int pop() {
        return queue1.poll();

    }
    // 栈顶元素返回:
    // 1、将queue1中全部元素放入queue2中;
    // 2、queue1中最后一个数据作为结果返回
    // 3、将queue2中的数据写回queue1
    public int top() {
        return queue1.peek();

    }
    // 判断栈空:queue1(是存放数据的)是否为空
    public boolean empty() {
        return queue1.isEmpty();

    }
}
写在最后
  • 计算机二级的公共基础部分最容易出栈和队列的选择题,想对理论知识充分了解的的话,建议看这个→ B栈视频 - 栈和队列树与二叉树软件工程基础数据库视频教程

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

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

相关文章

windows中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换(保姆级教程,值得收藏)

前言 在工作中&#xff0c;我们可能同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&#xff0c;nvm就是为…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列&#xff08;一&#xff09;—— Git 的诞生&#xff0c;Lin…

Linux系统编程 --- 基础IO

形成共识原理&#xff1a; 1、文件 内容 属性 2、文件分为打开的文件和没打开的文件 3、打开的文件&#xff1a;谁打开&#xff1f;进程&#xff01;--- 本质是研究进程和文件的关系&#xff01; 文件被打开&#xff0c;必须先被加载到内存&#xff01; 一个进程可以打开…

PyTorch 训练自定义功能齐全的神经网络模型的详细教程

在前面的文章中&#xff0c;老牛同学介绍了不少大语言模型的部署、推理和微调&#xff0c;也通过大模型演示了我们的日常的工作需求场景。我们通过大语言模型&#xff0c;实实在在的感受到了它强大的功能&#xff0c;同时也从中受益颇多。 今天&#xff0c;老牛同学想和大家一…

【Android Studiio】default activity 原生安卓和uniapp默认启动分析

文章目录 思路&#xff1a; 一、原生安卓二、uniapp 探究方向&#xff1a;找到Default Activity 思路&#xff1a; 在Android开发中&#xff0c;"default activity"这个概念通常指的是应用启动时默认会加载和显示的那个Activity。AndroidManifest.xml文件是Android…

基于Selenium实现操作网页及操作windows桌面应用

Selenium操作Web页面 Why? 通常情况下&#xff0c;网络安全相关领域&#xff0c;更多是偏重于协议和通信。但是&#xff0c;如果协议通信过程被加密或者无法了解其协议构成&#xff0c;是无法直接通过协议进行处理。此时&#xff0c;可以考虑模拟UI操作&#xff0c;进而实现相…

声音和数据之间的调制解调 —— 电报机和电传打字机如何影响计算机的演变

注&#xff1a;机翻&#xff0c;未校对。 The Squeal of Data The through line between the telegraph and the computer is more direct than you might realize. Its influence can be seen in common technologies, like the modem. 电报和计算机之间的直通线比你想象的要…

基于IOT架构的数据采集监控平台!

LP-SCADA数据采集监控平台是蓝鹏测控推出的一款聚焦于工业领域的自动化数据采集监控系统&#xff0c; 助力数字工厂建设的统一监控平台。 为企业提供从下到上的完整的生产信息采集与集成服务&#xff0c;从而为企业综合自动化、工厂数字化及完整的"管控一体化”的解决方案…

LockSupport详解

文章目录 理解可重入锁LockSupport线程等待唤醒机制&#xff08;wait/notify&#xff09; waitNotify限制awaitSignal限制LockSupport重点说明 理解可重入锁 可重入锁的种类&#xff1a; 隐式锁&#xff08;即synchronized关键字使用的锁&#xff09;默认是可重入锁。 同步代…

站在临床数据科学的角度,药物试验归根结底是这两大假设

在临床数据科学的领域中&#xff0c;药物试验的设计和实施是评估药物效果及其安全性的关键环节。药物试验的基础无外乎两大核心假设&#xff1a;有效性与安全性。这两个假设不仅是药物试验的起点&#xff0c;也是整个研究过程中的重要指导原则。 药物试验的核心主旨在于对待测试…

Python高性能计算:进程、线程、协程、并发、并行、同步、异步

这里写目录标题 进程、线程、协程并发、并行同步、异步I/O密集型任务、CPU密集型任务 进程、线程、协程 进程、线程和协程是计算机程序执行的三种不同方式&#xff0c;它们在资源管理、执行模型和调度机制上有显著的区别。以下是对它们的详细解释和比较&#xff1a; 进程&…

一款有趣的工具,锁定鼠标键盘,绿色免安装

这是一款完全免费的程序&#xff0c;可以实现在不锁定屏幕的情况下锁定鼠标键盘&#xff0c;让鼠标键盘无法操作。比较适合防止误碰鼠标键盘&#xff0c;以及离开电脑时不希望别人操作自己的电脑。 ★★★★★锁定鼠标键盘工具&#xff1a;https://pan.quark.cn/s/e5c518a2165…

路由配置修改(五)

一、默认约定式路由 1、umi 会根据 pages 目录自动生成路由配置。 * name umi 的路由配置* description 只支持 path,component,routes,redirect,wrappers,name,icon 的配置* param path path 只支持两种占位符配置&#xff0c;第一种是动态参数 :id 的形式&#xff0c;第二种…

win11 intel新显卡控制面板无自定义分辨率选项解决

问题 下图是现在的intel显卡控制面板&#xff0c;不知道为啥变得很傻瓜式了&#xff0c;连所有显卡控制面板都有的分辨率自定义也被干掉了。 解决方式 其实解决很简单&#xff0c;因为自定义分辨率对显卡玩游戏来说还是很常用的&#xff0c;intel在beta版又加回来了&#x…

样式与特效(2)——新闻列表

1.盒子模型的边距概念 ) Margin-top 上面 Margin-bottom 底部 Margin-right 右边 Margin-left 左边 Margin : 10px &#xff08;上下左右都是10px&#xff09; Margin &#xff1a;10px,20px (上下边距10px 左右20px) CSS里面最重要的属性之一 将页面理解成…

C++ | Leetcode C++题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; class Solution { public:string removeDuplicateLetters(string s) {vector<int> vis(26), num(26);for (char ch : s) {num[ch - a];}string stk;for (char ch : s) {if (!vis[ch - a]) {while (!stk.empty() && stk.back(…

C#值类型和引用类型,类和结构体

1、类class是引用类型&#xff0c;多个引用类型变量的值会互相影响。存储在堆&#xff08;heap&#xff09;上 2、结构体struct是值类型&#xff0c;多个值类型变量的值不会互相影响。存储在栈&#xff08;stack&#xff09;上 using System; using System.Collections.Generi…

PTA题目|象限的判断(python)

题目要求 输入一对坐标&#xff0c;输出它在直角坐标系中的象限。 输入格式: 输入坐标(x,y)&#xff0c;&#xff08;假设输入的x或y坐标值一定不会为0&#xff09;如&#xff1a;(3.5,-2)。 输出格式: 输出对应的象限&#xff0c;如&#xff1a;第四象限 输入样例: 在这…

Python | Leetcode Python题解之第315题计算右侧小于当前元素的个数

题目&#xff1a; 题解&#xff1a; import numpy as np from bisect import bisect_leftclass Solution:max_len 10000c []buckets []def countSmaller(self, nums: List[int]) -> List[int]:self.c [0 for _ in range(len(nums) 5)]counts [0 for _ in range(len(…

Sentinel-1 Level 1数据处理的详细算法定义(五)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下: Sentinel-1 L…