Java中的Stack与Queue

news2024/11/30 10:42:02

文章目录

  • 一、栈的概念及使用
    • 1.1 概念
    • 1.2 栈的使用
    • 1.3 栈的模拟实现
  • 二、队列的概念及使用
    • 2.1 概念
    • 2.2 队列的使用
    • 2.3 双端队列(Deque)
  • 三、相关OJ题
    • 3.1 用队列实现栈。
    • 3.2 用栈实现队列。
  • 总结

一、栈的概念及使用

1.1 概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端栈顶,另一端称为栈底。栈中的数据元素遵循后进先出的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈,出数据在栈顶

1.2 栈的使用

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空
public static void main(String[] args) {
	Stack<Integer> s = new Stack();
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	System.out.println(s.size()); // 获取栈中有效元素个数---> 4
	System.out.println(s.peek()); // 获取栈顶元素---> 4
	s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3
	System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
	if(s.empty()){
		System.out.println("栈空");
	}else{
		System.out.println(s.size());
	}
}

1.3 栈的模拟实现

在这里插入图片描述
从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

public class MyStack {
	int[] array;
	int size;
	public MyStack(){
		array = new int[3];
	}
	public int push(int e){
		ensureCapacity();
		array[size++] = e;
		return e;
	}
	public int pop(){
		int e = peek();
		size--;
		return e;
	}
	public int peek(){
		if(empty()){
			throw new RuntimeException("栈为空,无法获取栈顶元素");
		}
		return array[size-1];
	}
	public int size(){
		return size;
	}
	public boolean empty(){
		return 0 == size;
	}
	private void ensureCapacity(){
		if(size == array.length){
			array = Arrays.copyOf(array, size*2);
		}
	}
}

二、队列的概念及使用

2.1 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2.2 队列的使用

在java中,Queue是个接口,底层是通过链表实现的。
在这里插入图片描述

方法功能
boolean offer(E e)入队列
E pool()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检测元素是否为空

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {
	Queue<Integer> q = new LinkedList<>();
	q.offer(1);
	q.offer(2);
	q.offer(3);
	q.offer(4);
	q.offer(5); // 从队尾入队列
	System.out.println(q.size());
	System.out.println(q.peek()); // 获取队头元素
	q.poll();
	System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
	if(q.isEmpty()){
		System.out.println("队列空");
	}else{
		System.out.println(q.size());
	}
}

2.3 双端队列(Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque是"double ended queue"的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

Deque是一个接口,使用时必须创建LinkedList的对象。

在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

Deque<Integer> stack = new ArrayDeque<>(); //双端队列的线性实现
Deque<Integer> queue = new LinkedList<>(); //双端队列的链式实现

三、相关OJ题

3.1 用队列实现栈。

OJ链接

代码如下:

class MyStack {

    private Queue<Integer> qu1;
    private Queue<Integer> qu2;
    public MyStack() {
        qu1 = new LinkedList<>();
        qu2 = new LinkedList<>();
    }
    
    public void push(int x) {
        if(!qu1.isEmpty()) {
            qu1.offer(x);
        }else if (!qu2.isEmpty()) {
            qu2.offer(x);
        }else  {
            qu1.offer(x);
        }
    }
    
    public int pop() {
        if(empty()) {
            return -1;
        }
        if(!qu1.isEmpty()) {
            int size = qu1.size();
            for (int i = 0; i < size-1; i++) {
                int val = qu1.poll();
                qu2.offer(val);
            }
            return qu1.poll();
        }else  {
            int size = qu2.size();
            for (int i = 0; i < size-1; i++) {
                int val = qu2.poll();
                qu1.offer(val);
            }
            return qu2.poll();
        }
    }
    
    public int top() {
        if(empty()) {
            return -1;
        }
        if(!qu1.isEmpty()) {
            int size = qu1.size();
            int val = -1;
            for (int i = 0; i < size; i++) {
                val = qu1.poll();
                qu2.offer(val);
            }
            return val;
        }else  {
            int size = qu2.size();
            int val = -1;
            for (int i = 0; i < size; i++) {
                val = qu2.poll();
                qu1.offer(val);
            }
            return val;
        }
    }
    
    public boolean empty() {
        return qu1.isEmpty() && qu2.isEmpty();
    }
}

3.2 用栈实现队列。

OJ链接

代码如下:

class MyQueue {

    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        if(empty()) {
            return -1;
        }
        if(stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
    
    public int peek() {
        if(empty()) {
            return -1;
        }
        if(stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }
    
    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了栈与队列的概念及其使用,栈与队列在解决实际问题中有着很大的作用,我们需要多练习,熟能生巧。

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

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

相关文章

【Git】码云

目录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 6.1 创建远程仓库 6.2 远程仓库操作 6.3 SSH 免密登录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 码云网址&#xff1a; https://githee.com/ 账号验证…

【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

干货 | 中小企业选型 Elasticsearch 避坑指南

1、线上常见问题在我线下对接企业或线上交流的时候&#xff0c;经常会遇到各种业务场景不同的问题。比如&#xff0c;常见问题归类如下&#xff1a;常见问题1&#xff1a;ES 适合场景及架构选型问题。公司的核心业务是做企业员工健康管理&#xff0c;数据来自电子化后的员工体检…

【学习总结】相机与IMU标定一:Kalibr论文

论文&#xff1a;2013IROS论文&#xff0c;Unified Temporal and Spatial Calibration for Multi-Sensor Systems&#xff0c;是Kalibr工具的参考论文之一。介绍了如何进行IMU与相机标定。 参考的一篇资料&#xff1a;知乎&#xff1a;超全汇总&#xff01;多传感器离线/在线时…

Java【二叉树】相关知识+基本操作

文章目录前言一、树形结构1.树的定义2.树的概念&#xff08;术语&#xff09;3.树的存储结构二、二叉树1.二叉树的概念两种特殊的二叉树2.二叉树的性质3.二叉树的存储结构4.二叉树的基本操作4.1 二叉树的前序遍历--Preorder Traversal4.2 二叉树的中序遍历--Inorder Traversal4…

Vue项目中如何使用computed计算属性

computed: 1.基本使用 在computed中定义一个函数&#xff08;看起来是一个函数&#xff0c;其实是一个属性&#xff09;&#xff0c;命名按照属性规范命名(一般为名词)。 1.1 应用场景&#xff1a; 当数据A的逻辑很复杂时&#xff0c;把A这个数据写在计算属性里面 1.2 代码位置…

星戈瑞收藏Sulfo-CY7 amine/NHS ester/maleimide小鼠活体成像染料标记反应

关于小鼠活体成像&#xff0c;就一定要提到CY活性染料标记反应&#xff1a; 用不同的活性基团的Cyanine菁染料和相应的活性基团的生物分子或小分子药物发生反应&#xff0c;链接到一起。 根据需要标记的抗原、抗体、酶、多肽等分子所带的可标记基团的种类&#xff08;氨基、醛…

Java中GSON的使用(内含源代码)

Java中GSON的使用&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87474951 目录Java中GSON的使用&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;[https://download.csdn.net/dow…

智能遥测终端机 水文RTU 5G水资源监测 雨水情测报应用

M21F-V50系列智能遥测终端机是辰迈智慧自主研发的融合北斗三代短报文、4/5G公网通信、LoRa、Bluetooth、Ethernet等多种通信方式、数据采集及防盗报警于一体的智能遥测终端。产品内置数据采集器&#xff0c;实现内部模数转换&#xff0c;提供增量式雨量接口、RS232、RS485、以太…

【07-JVM面试专题-JVM运行时数据区的虚拟机栈你知道吗?它的基本结构是什么呢?你知道栈帧的结构吗?那你说说动态链接吧?】

JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态链接吧&#xff1f; JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态…

itk中的一些图像处理

文章目录1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值2.高斯平滑3.图像的高阶导数 RecursiveGaussianImageFilter4.均值滤波5.中值滤波6.离散高斯平滑7.曲率驱动流去噪图像 CurvatureFlowImageFilter8.由参数alpha和beta控制的幂律自适应直方图均衡化9.Canny 边缘…

React hooks之useContext《类比Vue的Provide》(三)

系列文章目录 提示&#xff1a;我又来更新啦&#xff01;&#xff01;&#xff01;这次又把之前useEffect的补充了一次&#xff01;&#xff01;&#xff01;&#xff01; 文章目录系列文章目录前言1.Vue中的Provide和useContext&#xff08;相同点&#xff09;2..Vue中的Provi…

大数据Hadoop教程-学习笔记02【Apache Hadoop、HDFS】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程教程资源&#xff1a;https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【P018-P037】大数据Hadoop教程-学习笔记0…

0301微分中值定理-微分中值定理与导数的应用

文章目录1 罗尔定理2 拉格朗日定理3 柯西中值定理5后记1 罗尔定理 费马引理 设函数f(x)在点x0f(x)在点x_0f(x)在点x0​的某邻域U(x0)U(x_0)U(x0​)内有定义&#xff0c;并且在点x0x_0x0​处可导&#xff0c;如果对任意的x∈U(x0),x\in U(x_0),x∈U(x0​),有 f(x)≤f(x0)(或f(x)…

给你的Vim加上自动编程功能

Vim 是高度可定制、可扩展的编辑器。这对热爱折腾的程序员来说&#xff0c;绝对是一种乐趣&#xff0c;同时也是进一步提升开发效率的源泉。近期CodeGeeX举办的黑客松活动中&#xff0c;参赛选手Lance 提交了一款名叫Vim with CodeGeeX的作品&#xff0c;这款作品是基于CodeGee…

Java开源工具库使用之httpclient

文章目录前言一、简单使用1.1 get 请求1.2 post 简单表单请求1.3 表单上传文件1.4 上传 json 数据二、高级用法2.1 超时和重试2.2 Cookie2.3 拦截器2.4 fluent API三、3.1旧版本使用3.1 Get 请求3.2 Post 请求四、异步版本使用4.1 基本请求4.2 请求流水线执行参考前言 HttpCli…

SSM SpringBoot vue 健康医疗预约系统

SSM SpringBoot vue 健康医疗预约系统 SSM 健康医疗预约系统 功能介绍 首页 图片轮播展示 出诊信息推荐 医院公告 科室信息 科室详情 出诊信息 医生详情 挂号预约 登录注册 留言反馈 个人中心 我的收藏 后台管理 登录 注册医生 个人中心 用户管理 科室信息管理 医生管理 出诊…

二、Java虚拟机的基本结构

Java虚拟机的架构1.内存结果概述2.类加载器子系统的作用3. 类加载器ClassLoader角色4.类的加载过程5.类加载器的分类1.引导类加载器(虚拟机自带的加载器)Bootstrap ClassLoader2.扩展类加载器(虚拟机自带的加载器) Extenssion ClassLoader3.应用程序类加载器(虚拟机自带的加载器…

CAN TP层函数介绍

如果想使用CAN TP层函数,首先需要在网络节点或测试节点配置页面的Componets组件一栏添加osek_tp.dll文件。路径为:C:\Program Files\Vector CANoe 15\Exec32 至于节点的CAPL程序内需不需要引用这个dll文件,无所谓,可写可不写。但是如果是其他dll,必须在CAPL程序中引用。为…

多服务器节点访问解决一人一单问题+redis设置锁方案

项目地址及项目具体介绍-码云仓库&#xff1a;https://gitee.com/flowers-bloom-is-the-sea/distributeNodeSolvePessimisticLockByRedis 测试1&#xff1a; 这里使用jmeter同时启动2各线程&#xff1a; 原来的数据库表的数据&#xff1a; goods的数据是&#xff1a; id …