数据结构:栈和队列详解

栈的概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出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,一经查实,立即删除!

相关文章

3-自动驾驶车辆路径规划

在自动驾驶领域&#xff0c;轨迹搜索&#xff08;Trajectory Searching&#xff09;和轨迹生成&#xff08;Trajectory Generation&#xff09;是两个密切相关但有所不同的概念&#xff0c;它们都是自动驾驶车辆规划其行驶路径的关键步骤。 轨迹搜索&#xff08;Trajectory Se…

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为主,…

python开发之代码规范

1、背景 现实中进行python代码开发&#xff0c;需要遵循一定的规范&#xff0c;这个规范对后期维护起到的作用很大。 2、规范 https://peps.python.org/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds

Java中的设计模式:实战案例分享

Java中的设计模式&#xff1a;实战案例分享 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 设计模式是软件开发中的宝贵工具&#xff0c;它们为常见的问题提供…

Redis 7.x 系列【5】 基础命令

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 KEYS2.2 DEL2.3 EXISTS2.4 EXPIRE2.5 TTL2.6 RENAME2.7 TYPE2.…

【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;那就不可能再编写代码了。而且…

华为OD机考题HJ20 密码验证合格程序

前言 应广大同学要求&#xff0c;开始以OD机考题作为练习题&#xff0c;看看算法和数据结构掌握情况。有需要练习的可以关注下。 描述 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有长度大于2的包含公共元素的子串重复 &#xff08…

【华为OD机试B卷】整数编码(C++/Java/Python)

题目 题目描述 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 编码时7位一组,每个字节的低7位用于存储待编码数字的补码字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节。采用小端序编…

音视频入门基础: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裸流文件 音视频入门基础&…

供应全志T507-H芯片

长期供应各品牌芯片&#xff1a; T507-H D6FH1G842A3CZ D6DA2G140K2A7-Z D5DA942M5K2G6 MT51J256M32HF-70:B MT62F1536M64D8CH-031 WT:A MT62F1536M64D8CL-023 WT:B MT62F1536M64D8CL-026 WT:B MT62F1536M64D8EK-023 WT:B MT62F1G64D8CH-031 WT:B SVF8N65RDTR 60…

SpringBoot-在配置文件中使用Profile

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

浔川AI五子棋(改进(完整)版1.3)——浔川python社

简介&#xff1a; 浔川AI五子棋是一种使用人工智能技术来进行五子棋对弈的游戏。它采用了先进的算法和模型&#xff0c;在对弈过程中能够实时分析棋局并进行决策&#xff0c;使得游戏更具挑战性和趣味性。 浔川AI五子棋的核心技术是人工智能算法。它使用深度学习模型对大量的…

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

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

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

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