数据结构 栈和队列

数据结构 栈和队列

文章目录

📕1.栈(Stack)

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

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

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

在这里插入图片描述


从下图中我们可以看到,Stack类继承了Vector类,Vector和ArrayList类似,都是动态的顺序表,不同的是
Vector是线程安全的(有关线程问题请阅读JAVA EE ------> 多线程篇)。

在这里插入图片描述
✏️1.1 栈的基本操作
方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean Empty()检测栈是否为空
✏️1.2 栈的模拟实现

栈模拟实现源码,点击即可传送!!!

🔖1.2.1 构造方法
在这里插入图片描述
🔖1.2.2 扩容方法
在这里插入图片描述
🔖1.2.3 判断栈是否为空或是否满
在这里插入图片描述
🔖1.2.4 存储元素
在这里插入图片描述
🔖1.2.5 删除元素
在这里插入图片描述
🔖1.2. 6 获取栈顶元素
在这里插入图片描述
✏️1.3 逆波兰表达式

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式形式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

逆波兰表达式计算: 以leetcode150题为例 逆波兰表达式求值

利用逆波兰表达式计算时,使用一个栈来存储操作数,从左到右遍历逆波兰表达式,进行如下操作:

  1. 如果遇到操作数,则将操作数入栈;
  2. 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈;
  3. 遍历完成后,栈内只有一个元素,该元素即为逆波兰表达式的值。

逆波兰表达式解决代码,点击传送!!!

📕2. 队列

在这里插入图片描述

队列:只允许在⼀端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列遵循先进先出FIFO(First In First Out)原则
入队列:进行插入操作的一端称为队尾(Tail/Rear)
出队列:进行删除操作的一端称为队头(Head/Front)

在这里插入图片描述


在Java中,Queue是个接口,底层是通过链表实现的。

✏️2.1 队列的基本操作
方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检查队列是否为空

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

Queue<Integer> q =newLinkedList<>();//实例化Linkedlist对象
✏️2.2 队列的模拟实现

队列的实现采用双向链表,链表头与链表尾都可以当作队头和队尾,时间复杂度都是O(1)

/** * name:XulongZhu */publicclassMyQueue{//内部类,一个双向链表的节点staticclassNode{Node prev;Node next;int val;//节点的构造方法publicNode(int val){this.val = val;}}//链表的头和尾publicNode front;publicNode rear;/** * 规定:链表头为队列头,链表尾为队列尾,插入采用尾插法 *///添加元素publicvoidoffer(int val){Node node =newNode(val);//队列为空时if(front==null){ front = node; rear = node;}else{ rear.next = node; node.prev = rear; rear = node;}}//获取队头值publicintpeek(){//防止队列中没有元素if(front==null){return-1;}return front.val;}//获取队列中有效元素个数publicintsize(){int count =0;Node cur = front;while(cur!=null){ cur = cur.next; count++;}return count;}//删除队列中元素,并返回publicintpoll(){//队列为空if(front==null){return-1;}int val = front.val; front = front.next;//只有一个结点的话,此时front是null,让rear也为null,此时双向链表里就一个节点都没有了if(front!=null){ front.prev =null;}else{ rear =null;}return val;}}
✏️2.3 循环队列

环形队列通常使用数组实现。

在这里插入图片描述
  1. 数列下标循环小技巧
//定义数组下标,初始位置为0int index =0;//遍历时不让index++,而是让index++后对数组长度取余,这样便可达到数组下标循环效果 index =(index+1)% arr.length 
  1. 如何区分环形队列空与满
    A: 通过添加SIZE属性,当SIZE等于数组长度是,环形队列就是满的.
    B: 牺牲一个位置,假设数组长度为8,但是只存放7个数据
    C: 使用标记,队列为空时,front = rear = 0,标志位 isFull = false.每次⼊队检查rear是否与 front 重合,如果重合设置 isFull = true,表示队列已满,否则,正常入队并移动 rear.出队时,移动 front 指针,设置 isFull = false.

练习题:设计循环代码
源码,点击传送!!!

✏️2.3 双端队列

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

在这里插入图片描述


在这里插入图片描述


💡💡💡注意:因为Deque是一个接口,所以不能实例化,使用时必须创建LinkedList的对象。

Read more

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型 * 什么是"一切皆对象"? * Python对象的类型层次 * 1. 内置类型对象 * 2. 函数对象 * 3. 类对象和实例对象 * 4. 模块对象 * 对象行为的统一性 * 特殊方法:对象行为的背后 * 对象模型的实际应用 * 性能考虑 * 总结 Python以其"一切皆对象"的设计哲学而闻名,这种设计为语言带来了极大的灵活性和一致性。本文将深入探讨Python的对象模型,解释为什么说"Python中一切皆对象",并通过实例展示这一特性如何影响我们的编程方式。 什么是"一切皆对象"? 在Python中,从简单的数字、字符串到复杂的函数、类甚至模块,所有这些都是对象。这意味着它们都有: 1. 身份(identity):对象在内存中的唯一地址,可通过id()函数获取 2.

By Ne0inhk
Python从0到100(九十四):深度可分离卷积的深入解析及在OPPORTUNITY数据集上的实战

Python从0到100(九十四):深度可分离卷积的深入解析及在OPPORTUNITY数据集上的实战

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 -专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、深度可分离卷积的基础原理 * 1. 传统卷积的痛点 * 2. 深度可分离卷积的核心思路 * 二、深度可分离卷积的架构 * 1. 输入层 * 2. 深度可分离卷积模块 * 2.1 深度卷积(Depthwise Convolution) * 2.2 点卷积(Pointwise Convolution)

By Ne0inhk
Anaconda安装(2024最新版)

Anaconda安装(2024最新版)

安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考我的博客! 第一步:下载anaconda安装包         官网:Anaconda | The Operating System for AI (不过官网是外网,这里推荐国内清华大学的镜像源,对于国内的网络友好,下载速度更快!) 清华镜像网:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /anaconda/archive/ | 清华大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务,帮助用户更方便地获取开源软件。本镜像站由清华大学 TUNA 协会负责运行维护。https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/         这里有许多版本,博主这些选择下载最新版本的2024.06-1版本

By Ne0inhk
2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑

2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 哈喽,各位想入门AI的小伙伴!随着生成式AI、大模型应用的爆发,Python+AI已成为最热门的技术组合,无论应届生求职、职场人转型还是兴趣探索,掌握这门技能都能打开新赛道。但很多新手都会陷入“先学Python还是先学AI”“数学不好能不能学”“学完不会实战”的困境。 本文结合2026年AI技术趋势,用「知识点+核心代码+流程图+表格」的形式,从零基础打通Python+AI入门全链路,聚焦热门易上手方向,全程干货,新手可直接跟着练,老司机可查漏补缺~ 一、为什么2026年入门AI,首选Python? 很多新手会问:“学AI一定要用Python吗?Java、C++不行吗?” 答案是:不是不行,但Python是效率最高、门槛最低、生态最完善的选择,

By Ne0inhk