数据结构:栈和队列详解

栈的概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出LIFO(Last In First Out)的原则。大家可以理解为给弹匣压子弹,先压的子弹在最后才能打出,概念图如下

栈的简单实用

public class Main {public static void main(String[] args) {Stack<Integer> s = new Stack();    //<Integer>表示栈中全是整形数据s.push(1);     //向栈中压入1,2, 3, 4s.push(2);s.push(3);s.push(4);System.out.println(s.size()); // 获取栈中有效元素个数---> 4System.out.println(s.peek()); // 获取栈顶元素---> 4       peek只获取栈顶元素,并不出栈s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3                pop出栈,栈顶由原来的4,变为3System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3if(s.empty()){System.out.println("栈空");}else{System.out.println(s.size());}}
}

栈的模拟实现

import java.util.Arrays;public class MyStack {int[] arr;      //  使用数组来模拟栈的实现int size=0;     //用size来记录入栈时的下标public MyStack() {arr=new int[3];     //初试化,开始数组的长度为3}public void push(int val){expansion();        //定义一个函数,来判断数组是否满了,如果满了,就为数组进行扩容arr[size]=val;          size++;             //为数组赋值后,下标后移}public int peek(){if(isempty()){System.out.println("栈为空");}return arr[size-1];     //在push中,将size++了,要获取栈顶元素,将下标前移一位}public int pop(){if(isempty()){System.out.println("栈为空");}int s = arr[size-1];size--;             //弹出一个数据后,有效位前移一位return s;}public boolean isempty(){if(size==0){return true;}else return false;}public  void expansion(){if(size==arr.length){       //有效位和数组长度相等表面数组不够用了,需要扩容arr= Arrays.copyOf(arr,size*2);}}}

概念区分(栈、虚拟机栈、栈帧有什么区别呢?)

栈:一般数据结构概念,用于实现LIFO(先进后出)行为。

虚拟机栈:JVM为每个线程分配的私有栈,用于存储方法调用状态。

栈帧:虚拟机栈中的基本单元,代表单个方法调用的执行状态。

队列(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());
}
}

循环队列的实现

一个循环队列的实现,需要实现一下功能

class MyCircularQueue {//构造器,设置队列长度为 kpublic MyCircularQueue(int k) {}//向循环队列插入一个元素。如果成功插入则返回真。public boolean enQueue(int value) {}//从循环队列中删除一个元素。如果成功删除则返回真public boolean deQueue() {}//从队首获取元素。如果队列为空,返回 -1public int Front() {}//获取队尾元素。如果队列为空,返回 -1public int Rear() {}//检查循环队列是否为空public boolean isEmpty() {}//检查循环队列是否已满public boolean isFull() {}
}

我们使用数组来一步一步的实现,在下图中,红色字体代表循环队列的下标,蓝色字体代表下标对应的值,front代表啊队头,rear代表队尾

循环队列的满与空

有上图可以得出,当对头和队尾相遇的时候,说明整个队列满了,这时就又有一个问题,如果rear==front表示队列满了,当队列为空时,rear也是等于front的,这样就不好区分了,所以我们可以浪费一个空间,当rear走到下标为6的位置就表明整个队列满了,下标为7的位置浪费掉,以此来区分 ‘满’ 与 ‘空’ 的区别,代码如下

class MyCircularQueue {public int front;public int rear;int [] elem;//构造器,设置队列长度为 kpublic MyCircularQueue(int k) {elem=new int[k+1];    //因为浪费了一个空间,所以在初试化的时候要求给k个空间//实际给了k+1个空间}//向循环队列插入一个元素。如果成功插入则返回真。public boolean enQueue(int value) {}//从循环队列中删除一个元素。如果成功删除则返回真public boolean deQueue() {}//从队首获取元素。如果队列为空,返回 -1public int Front() {}//获取队尾元素。如果队列为空,返回 -1public int Rear() {}//检查循环队列是否为空public boolean isEmpty() {return front==rear;}//检查循环队列是否已满public boolean isFull() {return (rear+1)%elem.length==front;//这里大家可以当一个公式记住,当前下标加1 % 整个数组的长度,得到下一个下标的位//下一个下标的位置和对头相等代表数组满了}
}
入队操作

当队列不满的时候才能进行入队操作,所以要先判断队列是否满了,当队列不满的时候直接在队尾(rear)的位置上赋值,rear再前移一个位置,代码如下

public boolean enQueue(int value) {if(isFull()){return false;    //判断队列是否满了}elem[rear]=value;   //给队尾赋值rear = (rear+1)%elem.length;    //rear位置前移;return true;}
删除对头操作

删除对头的时候要先判断队列是否为空,当队列不为空的时候,front前移一个位置,得到对头元素同理

//从循环队列中删除一个元素。如果成功删除则返回真
public boolean deQueue() {if(isEmpty()){return false;}front=(front+1)%elem.length;return true;       }//从队首获取元素。如果队列为空,返回 -1public int Front() {if(isEmpty()){return -1;}return elem[front];}
获得队尾元素

队尾的元素为下标rear前一个位置的元素,所以当rear为0时,队尾的下标不可能时-1,应为队列长度-1,完整代码如下

class MyCircularQueue {public int front;public int rear;int [] elem;//构造器,设置队列长度为 kpublic MyCircularQueue(int k) {elem=new int[k+1];}//向循环队列插入一个元素。如果成功插入则返回真。public boolean enQueue(int value) {if(isFull()){return false;}elem[rear]=value;   //给队尾赋值rear = (rear+1)%elem.length;    //rear位置后移;return true;}//从循环队列中删除一个元素。如果成功删除则返回真public boolean deQueue() {if(isEmpty()){return false;}front=(front+1)%elem.length;return true;}//从队首获取元素。如果队列为空,返回 -1public int Front() {if(isEmpty()){return -1;}return elem[front];}//获取队尾元素。如果队列为空,返回 -1public int Rear() {if(isEmpty()){return -1;}int index = (rear==0)?elem.length-1:rear-1;return elem[index];}//检查循环队列是否为空public boolean isEmpty() {return front==rear;}//检查循环队列是否已满public boolean isFull() {return (rear+1)%elem.length==front;}
}

有帮助麻烦点个支持哈

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

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

相关文章

Day60 代码随想录打卡|回溯算法篇---组合

题目&#xff08;leecode T77&#xff09;&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 方法&#xff1a;本题最直观的解法是使用暴力for循环遍历法&#xff0c;根据k的大小定for循环的嵌套次数&…

Posix消息队列使用总结

Posix在线文档&#xff1a; The Single UNIX Specification, Version 2 (opengroup.org) Linux系统中提供了两种不同接口的消息队列&#xff1a; POSIX消息队列。POSIX为可移植的操作系统接口。System V消息队列。System V 是 AT&T 的第一个商业UNIX版本(UNIX System III)的…

[Python人工智能] 四十六.PyTorch入门 (1)环境搭建、神经网络普及和Torch基础知识

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别研究。这篇文章将介绍PyTorch入门知识。前面我们的Python人工智能主要以TensorFlow和Keras为主,…

【Linux】进程间通信_4

文章目录 七、进程间通信1. 进程间通信分类systeam V共享内存消息队列信号量 未完待续 七、进程间通信 1. 进程间通信分类 systeam V共享内存 进程间通信的本质就是让不同进程看到同一份资源。而systeam V是通过让不同的进程经过页表映射到同一块内存空间&#xff08;操作系…

LED显示屏中什么是静态驱动?什么是扫描驱动?两者的区别是什么?

随着科技的飞速发展&#xff0c;LED显示屏作为现代信息显示技术的重要组成部分&#xff0c;正以其独特的优势引领着显示行业的革新。近日&#xff0c;LED显示屏市场呈现出蓬勃的发展态势&#xff0c;技术创新不断推动行业向前发展&#xff0c;让LED显示屏无论是在商场的广告牌、…

苏东坡传-读书笔记一

太守的官衙位于杭州中心&#xff0c;但是苏东坡却喜欢在较为富有诗意的地方办公。他往往在葛岭下面有十三间房子的寿星院办公&#xff0c;因为那里风光如画。看公文不在寒碧轩&#xff0c;就在雨奇堂。我们记得雨奇堂是从苏东坡西湖诗“山色空濛雨亦奇”而得名的。在这里&#…

04-Shell编程之正则表达式与文本处理器

4.1 正则表达式 4.1.1正则表达式概述 1.正则表达式的定义 正则表达式又称正规表达式&#xff0c;常规表达式。在代码中常简写为regex&#xff0c;regexp&#xff0c;或RE。正则表达式是使用一个字符来描述&#xff0c;匹配一系列符合某个句法规则的字符串&#xff0c;简单的…

【现代操作系统】什么是操作系统

1.前言 现代计算机系统由一个或多个处理器、主存、磁盘、打印机、键盘、鼠标、显示器、网络接口以及各种其他输入/输出设备组成。一般而言&#xff0c;现代计算机系统是一个复杂的系统。如果每位应用程序员都不得不掌握系统的所有细节&#xff0c;那就不可能再编写代码了。而且…

音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

SpringBoot-在配置文件中使用Profile

Profile&#xff0c;译为“配置文件” 在这里的Spring Boot也是一样&#xff0c;我们可以配置很多个Profile&#xff0c;每个Profile都对应一整个完整的全局配置&#xff0c;激活哪个&#xff0c;那个对应的全局配置就生效&#xff0c;具体的配置&#xff1a; 1、properties格…

漏洞挖掘 | 记一次edusrc--轻松拿下中危信息泄露

1.前言 也是一次漏洞挖掘的思路分享 上次我们讲过了关于小程序方面的一些小思路&#xff0c;即关于抓包更改id号造成的一个信息泄露&#xff0c;但是在小程序上的信息泄露很难涉及到公民三要素这是一个痛点&#xff0c;今天就来分享一下一次edu挖掘时挖到的一个涉及公民三要素…

【讲师招募】PowerData 2024数字经济开源行

【讲师招募】PowerData 2024数字经济开源行 活动信息讲师招募往期活动回顾 活动信息 2023&#xff0c;社区经过一年的发展&#xff0c;凝聚起了一批热爱数据、热爱开源的伙伴。 2024&#xff0c;社区计划在全国十个城市举办"数字经济-城市开源行"活动&#xff0c;连…

2024年最新中级会计职称考试题库。

46.甲将一汇票背书转让给乙&#xff0c;但该汇票上未记载乙的名称。其后&#xff0c;乙在该汇票被背书人栏内记载了自己的名称。根据《票据法》的规定&#xff0c;下列有关该汇票背书与记载效力的表述中&#xff0c;正确的是&#xff08;&#xff09;。 A.甲的背书无效&#x…

Qt案例-ApplicationExamples-Calqlatr

项目 一个Qt Quick应用程序设计的横向和纵向设备&#xff0c;使用自定义组件&#xff0c;响应式布局和JavaScript的应用程序逻辑。 项目路径&#xff1a; Qt\Examples\Qt-6.7.1\demos 环境&#xff1a;Qt6.7.1 MSVC 2019 64位 项目目录&#xff1a; calqlatr--CMakeList.txt…

三、用户中心项目笔记----后端多环境实战+原始部署

后端多环境主要是修改&#xff1a; 依赖的环境地址 数据库地址 缓存地址 消息队列地址 项目端口号 服务器配置 后端怎么去区分不同的环境&#xff1f; 我们后端的SpringBoot项目&#xff0c;通过application.yml添加不同后缀来区分配置文件 application.yml就是公共的配置&a…

Sam Altman:从少儿奇才到OpenAI掌舵人

自2022年底发布了ChatGPT以来&#xff0c;OpenAI及其首席执行官Sam Altman迅速成为科技界的焦点人物。Altman的崛起并非偶然&#xff0c;而是长期以来不断追求权力和创新的结果。本文将回顾Altman的成长历程&#xff0c;探索他如何一步步走向OpenAI的顶峰。 童年与教育背景 S…

乌班图Ubuntu 24.04初始化MySQL报错error while loading shared libraries: libaio.so.1

由于乌班图24.04 LTS已经发布了&#xff0c;因此准备新业务逐步往这上面迁移&#xff0c;毕竟支持有效期比22.04更长 准备在24.04上进行MySQL的初始化&#xff0c;因为习惯自定义安装存储目录&#xff0c;所以使用mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz这个最新的二进制版…

7款三维地球软件/框架:Google Earth SkylineGlobe,Cesium等

可视化大屏已经不满足于2D和3D展示了&#xff0c;开始向着星辰大海迈进了&#xff0c;本文介绍7款三维地球软件/开发框架&#xff0c;带各位老铁入个门。 1. Google Earth: 大名鼎鼎&#xff0c;Google Earth 是由 Google 开发的一款免费的虚拟地球软件。它提供了全球范围内的…

【自然语言处理系列】手动安装和测试Spacy中en_core_web_sm模型的详细教程

摘要&#xff1a;本教程旨在为自然语言处理&#xff08;NLP&#xff09;初学者提供一个详细的指南&#xff0c;用于手动安装流行的NLP库Spacy及其英语模型en_core_web_sm。文章将逐步指导您如何安装Spacy库、查看其版本&#xff0c;确定并下载适合的en_core_web_sm模型版本&…

HarmonyOS应用开发——Hello World

下载 HUAWEI DevEco Studio: https://developer.harmonyos.com/cn/develop/deveco-studio/#download 同意&#xff0c;进入配置页面&#xff1a; 配置下载源以及本地存放路径&#xff0c;包括nodejs和ohpm: 配置鸿蒙SDK路径&#xff1a; 接受协议&#xff1a; 确认无误后&#…