算法 - 栈和队列

算法 - 栈和队列

  • 算法 - 栈和队列
      • 1. 数组实现
      • 2. 链表实现
    • 队列

public interface MyStack<Item> extends Iterable<Item> {MyStack<Item> push(Item item);Item pop() throws Exception;boolean isEmpty();int size();}

1. 数组实现

public class ArrayStack<Item> implements MyStack<Item> {// 栈元素数组,只能通过转型来创建泛型数组private Item[] a = (Item[]) new Object[1];// 元素数量private int N = 0;@Overridepublic MyStack<Item> push(Item item) {check();a[N++] = item;return this;}@Overridepublic Item pop() throws Exception {if (isEmpty()) {throw new Exception("stack is empty");}Item item = a[--N];check();// 避免对象游离a[N] = null;return item;}private void check() {if (N >= a.length) {resize(2 * a.length);} else if (N > 0 && N <= a.length / 4) {resize(a.length / 2);}}/*** 调整数组大小,使得栈具有伸缩性*/private void resize(int size) {Item[] tmp = (Item[]) new Object[size];for (int i = 0; i < N; i++) {tmp[i] = a[i];}a = tmp;}@Overridepublic boolean isEmpty() {return N == 0;}@Overridepublic int size() {return N;}@Overridepublic Iterator<Item> iterator() {// 返回逆序遍历的迭代器return new Iterator<Item>() {private int i = N;@Overridepublic boolean hasNext() {return i > 0;}@Overridepublic Item next() {return a[--i];}};}
}

2. 链表实现

需要使用链表的头插法来实现,因为头插法中最后压入栈的元素在链表的开头,它的 next 指针指向前一个压入栈的元素,在弹出元素时就可以通过 next 指针遍历到前一个压入栈的元素从而让这个元素成为新的栈顶元素。

public class ListStack<Item> implements MyStack<Item> {private Node top = null;private int N = 0;private class Node {Item item;Node next;}@Overridepublic MyStack<Item> push(Item item) {Node newTop = new Node();newTop.item = item;newTop.next = top;top = newTop;N++;return this;}@Overridepublic Item pop() throws Exception {if (isEmpty()) {throw new Exception("stack is empty");}Item item = top.item;top = top.next;N--;return item;}@Overridepublic boolean isEmpty() {return N == 0;}@Overridepublic int size() {return N;}@Overridepublic Iterator<Item> iterator() {return new Iterator<Item>() {private Node cur = top;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic Item next() {Item item = cur.item;cur = cur.next;return item;}};}
}

队列

下面是队列的链表实现,需要维护 first 和 last 节点指针,分别指向队首和队尾。

这里需要考虑 first 和 last 指针哪个作为链表的开头。因为出队列操作需要让队首元素的下一个元素成为队首,所以需要容易获取下一个元素,而链表的头部节点的 next 指针指向下一个元素,因此可以让 first 指针链表的开头。

public interface MyQueue<Item> extends Iterable<Item> {int size();boolean isEmpty();MyQueue<Item> add(Item item);Item remove() throws Exception;
}
public class ListQueue<Item> implements MyQueue<Item> {private Node first;private Node last;int N = 0;private class Node {Item item;Node next;}@Overridepublic boolean isEmpty() {return N == 0;}@Overridepublic int size() {return N;}@Overridepublic MyQueue<Item> add(Item item) {Node newNode = new Node();newNode.item = item;newNode.next = null;if (isEmpty()) {last = newNode;first = newNode;} else {last.next = newNode;last = newNode;}N++;return this;}@Overridepublic Item remove() throws Exception {if (isEmpty()) {throw new Exception("queue is empty");}Node node = first;first = first.next;N--;if (isEmpty()) {last = null;}return node.item;}@Overridepublic Iterator<Item> iterator() {return new Iterator<Item>() {Node cur = first;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic Item next() {Item item = cur.item;cur = cur.next;return item;}};}
}

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

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

相关文章

在c#中使用CancellationToken取消任务

目录 &#x1f680;介绍&#xff1a; &#x1f424;简单举例 &#x1f680;IsCancellationRequested &#x1f680;ThrowIfCancellationRequested &#x1f424;在控制器中使用 &#x1f680;通过异步方法的参数使用cancellationToken &#x1f680;api结合ThrowIfCancel…

Docker Compose初使用

简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#xff08;cont…

【论文阅读 09】融合门控自注意力机制的生成对抗网络视频异常检测

2021年 中国图象图形学报 摘 要 背景&#xff1a; 视频异常行为检测是智能监控技术的研究重点&#xff0c;广泛应用于社会安防领域。当前的挑战之一是如何提高异常检测的准确性&#xff0c;这需要有效地建模视频数据的空间维度和时间维度信息。生成对抗网络&#xff08;GANs&…

langchain +gpt 报错 SSLError

解决版本2种 一加入下面代码: https://www.zhihu.com/question/588395420 import os os.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"二降低urllib3版本 urllib3 1.25.11错…

Stable Diffusion 系统教程 | 强大的ControlNet 控制网

2023年的2月13日&#xff0c;一款名叫ControlNet的插件横空出世&#xff0c;AI绘画变得更加可控 ControlNet直译过来很简单&#xff0c;就叫做控制网&#xff0c;开发者是一名华裔&#xff0c;毕业于苏州大学&#xff0c;目前在斯坦福做读博士一年级&#xff0c;大佬大佬&…

【lesson10】fork创建进程的现象解答

文章目录 fork现象fork问题 fork现象 我们先来看一段代码。 大家觉得这段代码的printf会打印几次&#xff1f; 结果&#xff1a; 我们可以清楚的看到&#xff0c;第二个printf打印了2次。 我们再来看一段不可思议的代码&#xff1a; 运行结果&#xff1a; 我们可以看到这r…

批量、在线学习, 参数、非参数学习

批量学习&#xff08;Batch Learning&#xff09;和在线学习&#xff08;Online Learning&#xff09; 批量学习 批量学习的概念非常容易理解&#xff0c;我们之前介绍的许多机器学习算法&#xff0c;如果没有特殊说明&#xff0c;都可以采用批量学习的方式。批量学习的过程通…

第35节——useLayoutEffect——了解

一、概念 组件挂载或渲染完成后调用。useLayoutEffect使用方法、所传参数和useEffect完全相同。 他们的不同点在于&#xff0c;你可以把useLayoutEffect等同于componentDidMount、componentDidUpdate&#xff0c;因为他们调用阶段是相同的。而useEffect是在componentDidMount…

iOS应用中的内存泄漏问题解决

解决iOS应用中的内存泄漏问题是非常重要的&#xff0c;因为内存泄漏可能导致应用变得缓慢或不稳定。以下是一些解决iOS内存泄漏问题的工具和方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 工具&…

SQLAlchemy Oracle Database 23c Free 集成之旅

SQLAlchemy & Oracle Database 23c Free 集成之旅 1. SQLAlchemy 是什么2. Oracle Database 23c Free 是什么3. 运行 Oracle Database 23c Free4. 学习 SQLAlchemy 统一教程4-1. 安装依赖库4-2. 建立连接 - 引擎4-3. 使用事务和 DBAPI4-3-1. 获取连接4-3-2. 提交更改4-3-3.…

【PowerQuery】Python自动刷新本地数据

Python数据刷新是开发爱好者和开发人员开发的PowerBI刷新模块进行数据刷新的手段,Python进行数据刷新是通过刷新PowerBI Desktop 的模式进行数据刷新。目前常用的Python的数据刷新模块是PbixRefresher,图为相关的模块和版本。 由于当前的脚本基于英文版本的PowerBI Desktop进…

【100天精通Python】Day69:Python可视化_实战:导航定位中预测轨迹和实际轨迹的3D动画,示例+代码

目录 1. 预测的3D轨迹和实际轨迹的动画图&#xff0c;同时动态更新 2 真值轨迹设置为静态的&#xff0c;预测轨迹不断更新 3 网格的三维坐标系有旋转运动&#xff0c;以此全方位展示预测轨迹和真值轨迹之间的空间关系 1. 预测的3D轨迹和实际轨迹的动画图&#xff0c;同时动态更…

vivo面试-Java

一、JAVA八股 1、Java实现线程的三种方式 (1) 继承 Thread 类&#xff1a; 创建一个新类&#xff0c;该类继承自Thread类&#xff0c;并重写run方法。然后创建该类的实例&#xff0c;并调用它的start方法来启动线程。 public class MyThread extends Thread {public void r…

【自然语言处理】关系抽取 —— SOLS 讲解

SOLS 论文信息 标题:Speaker-Oriented Latent Structures for Dialogue-Based Relation Extraction 作者:Guoshun Nan, Guoqing Luo, Sicong Leng, Yao Xiao, Wei Lu 发布时间与更新时间:2021.09.11 主题:自然语言处理、关系抽取、对话场景、跨语句、DialogRE、GCN arXiv:…

【owt】 Intel® Media SDK for Windows: MSDK2021R1

https://www.intel.com/content/www/us/en/developer/articles/tool/media-sdk.html官方网不提供下载了: 2021地址 直接下载: MSDK2021R1.exe老版本 Intel Media SDK(Windows版本) 大神的介绍:owt-client-native 需要 https://github.com/open-webrtc-toolkit/owt-client…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义&#xff1a;向量 A ⃗…

面向使用者的git与gerrit相关笔记

git与gerrit相关笔记 前言一、gerrit是什么&#xff1f;二、一些配置1.先配置全局email 和name2.gerrit配置ssh key3.可能遇到的问题 三、提交代码和合并冲突常用Git命令三件套严格的要求 总结 前言 本文是介绍什么是gerrit和工作中git与gerrit相关的命令来避免一些提交代码的…

05_CSS进阶技巧

1 CSS 规范 遵循以下顺序 布局定位属性&#xff1a;display/position/float/clear/visibility/overflow&#xff08;建议 display 第一个写&#xff09;自身属性&#xff1a;width/height/margin/padding/border/background文本属性&#xff1a;color/font/text-decoraction/…

EMQX Enterprise 5.2 发布:Flow 设计器,Amazon Kinesis,Azure Event Hubs

EMQX Enterprise 5.2.0 版本现已正式发布&#xff01; 新版本带来了一系列重磅更新&#xff0c;最令人瞩目的是可拖拽的可视化 Flow 设计器&#xff0c;它可以帮助企业快速创建、测试和部署数据集成。同时&#xff0c;我们新增了对 Amazon Kinesis 和 Azure Event Hubs 的支持…