Algo-Lab 2 Stack Queue ADT

Lab 2: Stack & Queue ADT

image-20240923223516163

Part 1

​ 这里只说一下最小栈的思路,我们可以在定义一个栈,来同步存储当前情况下的占的最小值。最小栈第一时间的想法可能是设定一个变量,每次push进来栈中的元素进行对比,保持最小值,但是这样做并没有考虑到如果POP时的各种情况。因此,我们设置一个最小值的栈,他和存储的栈同步Push和Pop,只是,它每次push 的是栈目前存储的元素中的最小的值,这样就解决了 Pop 后的最小值问题了。

public class StackMin<AnyType extends Comparable<AnyType>> implements StackInterface<AnyType> {private static final int MAX_SIZE = 1024;private AnyType[] xstack;private AnyType[] minstack;private int size;public StackMin() {this.xstack = (AnyType[]) new Object[MAX_SIZE];this.minstack = (AnyType[]) new Object[MAX_SIZE];this.size = 0;}@Overridepublic int size() {return this.size;}@Overridepublic AnyType pop() throws EmptyStackException {if (isEmpty()) {throw new EmptyStackException();}return this.xstack[--this.size];}@Overridepublic AnyType peek() throws EmptyStackException {if (isEmpty()) {throw new EmptyStackException();}return this.xstack[this.size - 1];}@Overridepublic void push(AnyType item) {if (this.size < MAX_SIZE) {this.xstack[this.size++] = item;if (size == 0 || item.compareTo(this.minstack[size - 1]) < 0) {this.minstack[this.size] = item;} else {this.minstack[this.size] = this.minstack[size - 1];}}}@Overridepublic void clear() {this.size = 0;}@Overridepublic boolean isEmpty() {return size() == 0;}public AnyType findMin() {return this.minstack[this.size - 1];}
}

image-20240923223533506

Part 2

​ 这个题目的主要思想是,寻找第一个比自己小的数距离,从暴力的角度来想,我每次遍历一个数字,就从这个数向前遍历,直到遇到比自己大的数为止,这样的时间复杂度是n方;考虑优化的话,可以进一步想到,如果前面的数比自己小,那么它的结果的距离范围的数字都会比自己小,则可以剪枝一部分遍历的时间;我们可以进一步的优化,设置一个栈,如果当前元素小于栈顶元素,则索引的距离即为所求;如果当前元素比栈顶元素值大的时候,则一直Pop出站,直到栈顶元素更大的时候,这时,两者的索引距离就是范围。下面是两种情况下的代码,一种是直接给了完整的数组可以查询的,一种是等待输入流随时输入随时输出的。

/*** Simple computeSpan static function* working on arrays*/public static int[] computeSpan(int[] input) {int len = input.length;int[] spans = new int[len];Stack<Integer> stack = new Stack<>();for (int i = 0; i < len; i++) {while (!stack.isEmpty() && input[stack.peek()] <= input[i]) {stack.pop();}spans[i] = (stack.isEmpty()) ? (i + 1) : (i - stack.peek());stack.push(i);}return spans;}/*** Compute the span of the input values* using a stack.* Complexity: THETA(n) where is n is the* number of values to compute the span of*/public void computeSpan() {Stack<Integer> priceStack = new Stack<>();Stack<Integer> indexStack = new Stack<>();int day = 0;while (input.hasNextInt()) {int price = input.nextInt();int span = 1;while (!priceStack.isEmpty() && priceStack.peek() <= price) {priceStack.pop();indexStack.pop();}if (indexStack.isEmpty()) {span = day + 1;} else {span = day - indexStack.peek();}priceStack.push(price);indexStack.push(day);output.printf("value: %d span: %d\n", price, span);day++;}}

image-20240923223542933

Part 3

​ 用链表写一个队列就不说了,寻找pair,浅谈一下,暴力的话,n方的复杂度依次遍历;优化的话,放在哈希表中,减去O(n)的查询的复杂度

public static void showPairs(int n, String fileName) throws FileNotFoundException, EmptyQueueException {ListQueue<Integer> queue = new ListQueue<>();Scanner scanner = new Scanner(new File(fileName));while (scanner.hasNextInt()) {queue.offer(scanner.nextInt());}scanner.close();Map<Integer, Integer> map = new HashMap<>();int index = 0;while (!queue.isEmpty()) {Integer num = queue.poll();if (map.containsKey(num - n)) {System.out.println("(" + (num - n) + "," + num + ")");}map.put(num, index++);}}

image-20240923223552679

Part 4

​ 用栈来写一个队列,思路也很简单,使用两个栈,一个输入,一个输出,当输出栈为空时,将输入栈的值全部压到输出栈中

package tiei.aads.adt;import java.util.Stack;/*** A class for queues implemented with stacks*/
public class StackQueue<AnyType> implements QueueInterface<AnyType> {private Stack<AnyType> instack = new Stack<>();private Stack<AnyType> outstack = new Stack<>();@Overridepublic int size() {return this.instack.size() + this.outstack.size();}@Overridepublic boolean isEmpty() {return this.instack.isEmpty() && this.outstack.isEmpty();
//        return QueueInterface.super.isEmpty();}@Overridepublic void offer(AnyType item) {this.instack.push(item);}@Overridepublic AnyType poll() throws EmptyQueueException {if(this.outstack.isEmpty()){while (this.instack.isEmpty()){this.outstack.push(this.instack.pop());}}return outstack.pop();}@Overridepublic AnyType peek() throws EmptyQueueException {if(this.outstack.isEmpty()){while (this.instack.isEmpty()){this.outstack.push(this.instack.pop());}}return outstack.peek();}
}

image-20240923223607171

Part 5

​ 是一个经典的T形火车问题,主要思路就是,使用一个Map,存储下一个目标火车所在的栈,然后依次将不是目标的元素存储到另一个栈中(因为你需要考虑最简洁的移动方式,所以需要精准找到目标火车的位置;如果不需要最简洁的要求,完全可以在两个栈中依次寻找就跟我下面还没有优化完全的代码一样)(过段时间我一定改)

package tiei.aads.adt;import java.util.*;/*** A class to arrange train configuration*/
public class TrainManagement {private String[] from; // the initial orderingprivate String[] to;   // the final orderingprivate StackInterface<String> U; // to hold the cars on track U(nsorted)private StackInterface<String> T; // to hold the cars on track T(emporary)private StackInterface<String> S; // to hold the cars on track S(orted)private Map<String, StackInterface<String>> map = new HashMap<>();/*** Build a TrainManagement object* Preconditions:* 'from' and 'to' have the same size N and are* both permutations of each other*/public TrainManagement(String[] from, String[] to) {this.from = from;this.to = to;U = new ArrayStack<>();T = new ArrayStack<>();S = new ArrayStack<>();for (int i = from.length - 1; i >= 0; i--) {U.push(from[i]);map.put(from[i], U);}}/*** Output the basic move commands to transfer* the cars from the 'from' order on track U* to the 'to' order on track S*/public void arrange() throws EmptyStackException {int toIndex = 0;while (toIndex < to.length) {String targetCar = to[toIndex];boolean found = false;while (!U.isEmpty()) {String car = U.pop();System.out.println("move car " + car + " from U to T");T.push(car);if (car.equals(targetCar)) {found = true;System.out.println("move car " + car + " from T to S");T.pop();toIndex++;break;}}while (!T.isEmpty() && !found) {String car = T.pop();System.out.println("move car " + car + " from T to U");U.push(car);}}}/*** A short main for quick testing*/public static void main(String[] args) throws EmptyStackException {String[] from = {"33", "11", "44", "22"};String[] to = {"11", "22", "33", "44"};TrainManagement tm = new TrainManagement(from, to);tm.arrange();}// expected output//// move car 33 from U to T// move car 11 from U to T// move car 11 from T to S// move car 44 from U to T// move car 22 from U to T// move car 22 from T to S// move car 44 from T to U// move car 33 from T to S// move car 44 from U to T// move car 44 from T to S
}

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

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

相关文章

pikachu XXE(XML外部实体注入)通关

靶场&#xff1a;pikachu 环境: 系统&#xff1a;Windows10 服务器&#xff1a;PHPstudy2018 靶场&#xff1a;pikachu 关卡提示说&#xff1a;这是一个接收xml数据的api 常用的Payload 回显 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY …

C++在Linux实现多线程和多进程的TCP服务器和客户端通信

多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Mysql集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Mysql集群 MySQL 集群是一种高可用性、高性能的数据库解决方案&#xff0c;旨在支持分布式应用程序&#xff0c;允许多个 MySQL 实例以集群的方式共同工作&#xff0c;提供数据冗余和故障恢复能力 搭建Mysql集群…

【QT基础】创建项目项目代码解释

目录 前言一&#xff0c;使⽤Qt Creator 新建项目1. 新建项目2. 选择项⽬模板3. 选择项⽬路径4. 选择构建系统5. 填写类信息设置界⾯6. 选择语⾔和翻译⽂件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 二&#xff0c;项目代码说明1. main.cpp文件2. Widget.h文件3. Widget.cp…

吉时利keiithley2440高精度测试仪KEITHLEY2410/2450数字源表

Keithley 2440数字源表&#xff0c;40V&#xff0c;5A&#xff0c;50W 其他功能&#xff1a; 四象限运行基本精度为 0.012%&#xff0c;分辨率为 5 1⁄2 位具有可编程电流源和电压钳的 6 线 Ω 测量通过 GPIB 以 4 1⁄2 位数字读取 1700 个读数/秒内置比较器&#xff0c;用于…

【java面经】Redis速记

目录 基本概念 string hash list set zset 常见问题及解决 缓存穿透 缓存击穿 缓存雪崩 Redis内存管理策略 noeviction allkeys-lru allkeys-random volatile-random volatile-ttl Redis持久化机制 RDB快照 AOF追加文件 Redis多线程特性 Redis应用场景 缓…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

深入剖析Docker容器安全:挑战与应对策略

随着容器技术的广泛应用&#xff0c;Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装&#xff0c;提高了资源利用率。然而&#xff0c;随着Docker的流行&#xff0c;其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…

塑料瓶回收流水线分拣系统源码分享

塑料瓶回收流水线分拣检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

信息安全数学基础(15)欧拉定理

前言 欧拉定理是数论中的一个重要定理&#xff0c;它建立了模运算下指数与模的互质关系。这个定理在密码学、信息安全等领域有着广泛的应用&#xff0c;特别是在公钥密码体制&#xff08;如RSA加密算法&#xff09;中。 一、表述 设 n 是一个正整数&#xff0c;a 是一个与 n 互…

C++速通LeetCode中等第3题-盛最多水的容器

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

【计算机网络篇】数据链路层 功能|组帧|流量控制与可靠传输机制

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【计算机网络篇…

智慧交通,智能消防系统助力高铁站安全

智慧交通是一项基于现代技术的创新领域&#xff0c;正不断为我们生活带来便利。在智慧交通领域中&#xff0c;高铁站是一个非常重要的环节。高铁站作为人流密集的区域&#xff0c;安全问题一直备受关注。为了提升高铁站的安全性和效率&#xff0c;智慧消防设备监测与集中监控系…

5、论文阅读:深水下的图像增强

深水下的图像增强 前言介绍贡献UWCNN介绍网络架构残差Residuals块 Blocks网络层密集串联网络深度减少边界伪影网络损失Loss后处理前言 水下场景中,与波长相关的光吸收和散射会降低图像的可见度,导致对比度低和色偏失真。为了解决这个问题,我们提出了一种基于卷积神经网络的…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

【自学笔记】支持向量机(3)——软间隔

引入 上一回解决了SVM在曲线边界的上的使用&#xff0c;使得非线性数据集也能得到正确的分类。然而&#xff0c;对于一个大数据集来说&#xff0c;极有可能大体呈线性分类趋势&#xff0c;但是边界处混杂&#xff0c;若仍采用原来的方式&#xff0c;会得到极其复杂的超平面边界…

【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

字母与符号检测系统源码分享

字母与符号检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

十二、JDK17的GC调优策略

文章目录 一、JVM有哪些参数可以调&#xff1f;二、从RocketMQ学习常用GC调优三部曲三、基于JDK17优化JVM内存布局1、定制堆内存大小2、定制非堆内存大小设置元空间设置线程栈空间设置热点代码缓存空间应用程序类数据共享 四、基于JDK17定制JVM的GC参数G1重要参数ZGC重要参数 五…

C++设计模式(更新中)

文章目录 1、创建型模式1.1 简单工厂&#xff08;Simple Factory&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.2 工厂方法&#xff08;Factory Method&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.3 抽象工厂&…