【栈和队列】java实现栈和队列以及集合中的栈和队列

news2025/2/25 18:08:06

前言:
大家好,我是良辰丫🏍🏍🏍,今天我带领大家去学习栈和队列的相关知识,💞💞💞栈和队列在数据结构中是相对简单的,但是应用还是蛮多的,不积小流无以成江海。加油,不断遨游知识的汪洋大海。🚀🚀🚀

🧑个人主页:良辰针不戳
📖所属专栏:java数据结构
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。


目录

  • 1、栈
    • 1.1 入栈序列选择题
    • 1.2 模拟栈的基本操作
    • 1.3 集合中栈的基本操作
  • 2、队列
    • 2.1 模拟队列的基本操作
    • 2.2 集合中队列的基本操作


1、栈

是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。下面摞在一起的碗可以形象的说明栈的特点,先放的碗最后拿出来。

在这里插入图片描述

栈的插入操作叫做入栈,栈的删除操作叫做出栈。这是一种特殊的数据结构类型,只能从一端进行操作,简单看一个图来更加深刻的了解栈。

在这里插入图片描述

1.1 入栈序列选择题

希望可以通过这个简单的选择题让大家更深刻的认识入栈序列。

在这里插入图片描述

  • A. 依次入栈ABCDE,然后出栈序列为EDCBA。
  • B.先入栈ABCD,然后出一个D,再入栈E,出栈E,==有的伙伴可能会疑惑,不是全要入栈才能进行出栈嘛?嘿嘿嘿,可以进栈一个,紧接着就进行出栈,这是一个误区。==然后出栈CBA。
  • C.先入栈ABCD,然后出DC,接着入栈E,然后出栈E,最后出栈,咿呀,我们会发现,现在栈里面还有A和B,但是A先进去的,B压着A,要出栈的话先出B,于是乎!这个出栈序列是错误的。怎么样,很简单吧,比起咱们高中学的知识点,这不是小儿科嘛!
  • D.这个序列是进一个出一个,此时,入栈序列和出栈序列是一样的。

1.2 模拟栈的基本操作

在实际操作中,我们不用写关于栈的操作代码,但是我们需要去了解栈的底层原理,通过了解栈的基本操作可以让我们更深刻的认识栈。

下面是java底层原理栈的基本操作。后序我们做题直接调用即可。

在这里插入图片描述

以下是模拟栈的基本操作,不难,我们就简单的用注释说明一下。

import java.util.*;
public class MyStack {
//栈的底层原理是数组
    public int[] elem;
    public int usedSize;//有效个数
    public MyStack() {
        this.elem = new int[10];
    }
    //入栈
    public void push(int val) {
        if(isFull()) {
            //满的话进行扩容
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        //记住入栈后有效个数一定要进行加1
        //如果大家不习惯这种写法,可以分开写
        elem[usedSize++] = val;
    }
    public boolean isFull() {
        return usedSize == elem.length;
    }
    //出栈
    public int pop() {
        if(isEmpty()) {
        //如果栈为空,直接可以抛出异常
        //不喜欢这种写法可以写一个输出语句提示一下,然后return退出
            throw new RuntimeException("栈是空的!");
        }
        //出栈后usedSize-1,下面两种写法都可以
        /*int val = elem[usedSize-1];
        usedSize--;
        return val;*/
       /* usedSize--;
        return elem[usedSize];*/
        return elem[--usedSize];
    }
    //判断是否为空
    public boolean isEmpty() {
        return usedSize == 0;
    }
    //peek和pop是有区别的,peek只提取栈顶元素,并没有出栈
    public int peek() {
        if(isEmpty()) {
            throw new RuntimeException("栈是空的!");
        }
        return elem[usedSize-1];
    }
}

1.3 集合中栈的基本操作

public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.pop());//4
        System.out.println(stack.pop());//3
        System.out.println(stack.pop());//2
        System.out.println(stack.peek());//1
        System.out.println(stack.pop());//1
    }

运行结果截图

在这里插入图片描述

看到这里,栈所涉及的知识点就基本完了,后面做题过程中,好多数据结构都会用到栈,就连链表相关题目很多都会涉及,学习完简单知识一定要去多刷题。

2、队列

队列这个词大家并不陌生,队列和排队其实大同小异。就像下面的小盆友,站在第一个的先出教室,站在最后一个的最后出教室,于是就引入了队列的特点,先进先出

在这里插入图片描述

2.1 模拟队列的基本操作

在这里插入图片描述

模拟队列的基本操作,这是通过一个链表实现的。

public class MyQueue {
    static class Node {
        public int val;
        public Node next;

        public Node(int val) {
            this.val = val;
        }
    }
    public Node head;
    public Node last;
    public int usedSize;

    //入队
    public void offer(int val) {
        Node node = new Node(val);
        if(head == null) {
            head = node;
            last = node;
        }else {
            last.next = node;
            last = node;
        }
        usedSize++;
    }

    public int poll() {
        if(empty()) {
            throw new EmptyException("队列为空");
        }
        int ret = head.val;
        head = head.next;
        if(head == null) {
            last = null;//只有一个节点 那么last也要置空
        }
        usedSize--;
        return ret;
    }

    public boolean empty() {
        return usedSize == 0;
    }

    public int peek() {
        if(empty()) {
            throw new EmptyException("队列为空");
        }
        return head.val;
    }

    public int getUsedSize() {
        return usedSize;
    }
}

2.2 集合中队列的基本操作

public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
    }

运行结果截图

在这里插入图片描述

后序:
今天栈和队列的学习就告一段落了,希望这篇文章能给大家带来帮助,如果这篇文章给大家带来一定的帮助的话,期待大家的点赞,三连哦!!!⛽⛽⛽你们的支持就是我的加油站哦。

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

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

相关文章

分享142个ASP源码,总有一款适合您

ASP源码 分享142个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 142个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1TxdTrCJpO08rKLCUzIh0hQ?pwdyhka 提取码&#x…

微信小程序+云函数+腾讯云对话机器人API(ChatBot)

文章目录 前言 一、小程序云开发是什么&#xff1f; 二、步骤 1. 在app.js中绑定好云环境id&#xff0c;并且选好当前环境以及选好云文件夹 2. 去到腾讯云API Explorer中选好Region地区和Query这个必填参数&#xff0c;然后进行代码生成 3. 在上面的API Explorer网站点击前往获…

Python局部函数及用法

Python 函数内部可以定义变量&#xff0c;这样就产生了局部变量&#xff0c;有读者可能会问&#xff0c;Python 函数内部能定义函数吗&#xff1f;答案是肯定的。Python 支持在函数内部定义函数&#xff0c;此类函数又称为局部函数。那么&#xff0c;局部函数有哪些特征&#x…

Redis实现好友关注 | 黑马点评

目录 一、关注和取关 二、共同关注 三、关注推送&#xff08;feed流&#xff09; 1、Timeline模式的方案 拉模式 推模式 推拉结合模式 总结 2、推模式实现关注推送 需求 feed流分页问题 feed流的滚动分页 实现推送到粉丝的收件箱 …

(学习笔记)opencv和dlib的基础操作

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 本篇文章将讲述作者对opencv和dlib基础操作的学习笔记。 首先来看opencv的11种基础操作 (1)imread 读取图片 (2)resize 图片缩放 (3)cvtColor 灰度化 (4)threshold 阈值化 (5)bitwise_not 图像取反 (6)a…

JavaEE-初识网络

目录一、局域网二、广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 协议四、协议分层五、封装和分用一、局域网 局域网&#xff0c;网络种类&#xff0c;覆盖范围一般是方圆几千米之内&#xff0c;其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局…

有序列表标签与无序列表标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body bgcolor"bisque"> <!-- 在ol有序列表标签和ul无序列表标签…

【初识数据库】进入数据库的大门+数据库基本操作

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;这个专栏我将带领大家去探索数据库的汪洋大海&#xff0c;我主要使用的数据库软件是MySQL&#xff0c;数据库软件大同小异&#xff0c;嘿嘿嘿&#xff0c;废话不多说&#x…

分布式事务Seata学习笔记

目录 1.Seata 是什么 2. Seata快速开始 2.1 Seata Server&#xff08;TC&#xff09;环境搭建 db存储模式Nacos(注册&配置中心)部署 3. Seata Client快速开始 4.demo源码:springcloudAlibaba: Alibaba微服务学习demo 1.Seata 是什么 Seata 是一款开源的分布式事务…

神级程序员上网都在看什么?

同样都是上网&#xff0c;为什么大神总能在最短时间内汲取最有效的信息呢&#xff1f; 不怕大神不上网&#xff0c;就怕大神上网比你精&#xff01;其实&#xff0c;你与大神的区别都藏在细节中。 这些神级网站都是我偷看他们电脑抄来的&#xff08;误&#xff09;&#xff0c;…

超链接(还称热连接)标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>超链接(还称热连接)</title> </head> <body> <!-- 超链接的特点&#xff1a; 1、有…

Python内置函数

5.6 Python内置函数 Python自带的所有内置函数如下&#xff1a; Python函数 以上为Python3.10中所有的内置函数&#xff0c;其中绝大部分在前面的学习当中都已经接触过了。这里在补充介绍下没有提到或学习到的函数。 5.6.1 callable(object) 描述 如果参数 object 是可调…

Java面试题,mysql相关基础问题(全是自己的总结,如有不对,敬请斧正)

mysql相关基础问题一、mysql中int类型单引号问题二、静态SQL与动态SQL1. 静态SQL2. 动态SQL3. 动态SQL与静态SQL的区别与联系一、mysql中int类型单引号问题 今天写mysql的时候发现了一个问题&#xff0c;在查询的时候不小心把int类型的id加上引号查询了&#xff0c;但是也能查…

Day08 C++STL入门基础知识五——vector容器(下) 插入删除-数据存取-交换容器-预留空间【全面深度剖析+例题代码展示】

More haste, less speed. 欲速则不达 文章目录1. 承接上文2. 插入操作2.1 函数原型(总括)2.2 尾插尾删2.2.1 操作2.2.2 代码展示2.2.3 测试结果2.3 迭代器插入2.3.1 操作2.3.2 代码展示2.3.3 测试结果2.4 think小思考2.4.1 小疑问2.4.2 思路2.4.3 代码展示2.4.4 测试结果3. 删除…

数据结构---堆

堆 定义 基本操作 建堆 堆排序 优先队列 一、堆的定义&#xff1a; 堆必须是一个完全二叉树 还得满足堆序性 什么是完全二叉树呢&#xff1f; 完全二叉树只允许最后一行不为满 且最后一行必须从左到右排序 最后一行元素之间不可有间隔&#xff0c;中间不可有空缺 如下几棵树…

CSS基础学习

HTMLCSSJavaScript 结构表现交互 学习内容&#xff1a; CSS是什么CSS怎么用&#xff08;快速入门&#xff09;CSS选择器&#xff08;重点难点&#xff09;美化网页&#xff08;文字&#xff0c;阴影&#xff0c;超链接&#xff0c;列表&#xff0c;渐变…&#xff09;盒子模型…

基于电压型磁链观测器的异步电机矢量控制学习

导读&#xff1a;本期主要介绍电压型磁链观测器&#xff08;voltage flux observer&#xff09;在静止坐标系下的表现形式&#xff0c;应用在异步电机矢量控制系统中。如需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。一、引言磁链估…

万字长文--详解Node.js(快速入门)

Node.js基础与扩展Node.js1、初识Node.js与内置模块1.1 Node.js初识1.2 fs文件系统模块1.3 path路径模块1.4 http模块2、模块化2.1 模块化的基本概念2.2 Node.js中模块化2.3 npm与包2.4 模块的加载机制3、Express3.1 初识Express3.2 Express路由3.3 Express中间件3.4 使用Expre…

LeetCode刷题复盘笔记—一文搞懂贪心算法之45. 跳跃游戏 II问题(贪心算法系列第五篇)

今日主要总结一下可以使用贪心算法解决的一道题目&#xff0c;45. 跳跃游戏 II 题目&#xff1a;45. 跳跃游戏 II Leetcode题目地址 题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度…

论文投稿指南——中文核心期刊推荐(铁路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…