当前位置: 首页 > news >正文

【刷题-PTA】堆栈模拟队列(代码+动态图解)

【刷题-PTA】堆栈模拟队列(代码+动态图解)

文章目录

  • 【刷题-PTA】堆栈模拟队列(代码+动态图解)
    • 题目
      • 输入格式:
      • 输出格式:
      • 输入样例:
      • 输出样例:
    • 分析题目
    • 区分两栈
    • 解题思路
    • 伪代码
    • 动图演示
    • 代码
    • 测试

题目

题目描述 :

设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。

所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:

  • int IsFull(Stack S):判断堆栈S是否已满,返回1或0;
  • int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0;
  • void Push(Stack S, ElementType item ):将元素item压入堆栈S
  • ElementType Pop(Stack S ):删除并返回S的栈顶元素。

实现队列的操作,即入队void AddQ(ElementType item)和出队ElementType DeleteQ()

输入格式:

输入首先给出两个正整数N1N2,表示堆栈S1S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。

输出格式:

对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。

输入样例:

3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T

输出样例:

ERROR:Full
1
ERROR:Full
2
3
4
7
8
ERROR:Empty

分析题目

  • 题目要求我们通过 栈数据 结构来模拟实现 队列 , 我们首先可以从两种数据结构的特点进行分析,然后找到解题的切入点.
  • 栈数据结构的特点是先进后出(FILO) , 队列数据结构的特点是先进先出(FIFO) , 现在要实现 用栈模拟队列的 增删(CR) .
  • 如果我们使用一个栈来实现队列是无法完成要求的,因为二者的结构特点完全不同,但是如果我们把栈的数量增加,也就是使用两个栈来模拟,一个负责出队的栈s1,另一个负责入队的栈s2,两个栈通过互相倒数据 ,来模拟出队和入队的操作.
  • 具体实现的时候,我们要时刻保证 负责出队的栈s1 不为空的情况下,栈帧位置的元素(即栈顶元素)始终是最先插入的元素(也就是可以出队的元素) , 负责入队的栈 s2 不为空的情况下, 栈帧位置的元素(即栈顶元素始)终是最后插入的元素(也就是刚入队的元素) --> **简单总结就是 : 负责出队的 s1 栈顶只能存放队头的元素, 负责入队的 s2 栈顶只能存放队尾的元素 , 具体怎么让这两个栈始终维持这样的状态就需要两个栈相辅相成 **

区分两栈

  • 我们需要考虑两种情况
  1. 如果两个栈的容量相同,那么哪个栈负责出队,哪个栈负责入队,就不用区分了,可以任选一个作为出队,剩下的就作为入队。
  2. 如果两个栈的容量不相同, 那么只能容量小的栈负责入队,容量大的负责出队。

问 :为什么当两个栈的容量不相同时,必须让容量小的负责入队,容量大的负责出队呢 ?

答 : 如果一个栈的容量小于另一个栈,将容量小的栈负责入队,容量大的栈负责出队,在特定情况下可能会导致无法完全倒出元素的问题。这是因为当负责入队的栈装满后,向负责出队的栈(必须为空)中倒元素时,负责出队的栈由于容量更小则无法容纳负责入队的栈中所有的元素,从而导致负责出队的栈的栈顶元素一定不是应该出队的元素(两栈中现存的所有元素中最先进来). 所以通常情况下,该元素依旧在负责入队的栈中,那么当你进行出队操作的时候,就会出队错误。所以通常情况下,队列的实现要求队头和队尾的栈具有相同的容量,以确保操作的一致性。但是如果题目指定了两个栈的容量不同,那么此时我们就需要特别处理以避免出现上述问题。

解题思路

封装了三个方法,键盘输入,如果输入A 表示 入队 Push , D 表示 出队 Pop ,T 表示 操作结束.

那么我们就应该写一个输入的循环,如果输入 A 就进行入队操作, 输入D就进行出队操作, 输入T就结束操作

  • 入队操作 :

    • s2 没有满
      只要s2 没有满就往s2中添加元素

    • s2满了
      如果s2满了且s1为空,就把s2中所有的元素全部倒给s1
      如果s2满了且s1不为空,那么插入失败 ,打印 ERROR:Full

  • 出队操作 :

    • s1不为空
      只要s1不为空就出队
    • s1为空
      s1为空就出队失败,打印 ERROR:Empty
  • 结束操作 : 直接 break


伪代码

我们在真正上手去写具体的代码之前可以事先按照解题的流程写出伪代码,写完之后,我们再按照伪代码走一遍,看看是否符合解题的逻辑,这个时候就相当于是在把正确答案的框架先体现测试出来.

(动态演示图太大,不能传过来,如果需要动动态演示图,可以评论区冒泡,我发你.)

动图演示

输入样例:
3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T

代码

import java.util.Scanner;
import java.util.Stack;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 辅助栈1, 用来入队Stack<Integer> s1 = new Stack<>();// 辅助栈2, 用来出队Stack<Integer> s2 = new Stack<>();// 栈1的容量int N1 = scanner.nextInt();// 栈2的容量int r2 = scanner.nextInt();while (scanner.hasNextLine()) {String opr = scanner.next();if (opr.equals("A")) {int val = scanner.nextInt();if (s2.size() < r2) {Push(s2, val);} else{if (s1.isEmpty()) {// s2满了,但s1是空的,那么就把s2的全部都移动到s1中去while (!s2.empty()) {Push(s1, s2.pop());}Push(s2, val);} else {System.out.println("ERROR:Full");}}} else if (opr.equals("D")) {if (!s1.isEmpty()) {int front = Pop(s1);System.out.println(front);} else if (!s2.isEmpty()) {// 如果s1为空但s2不为空,可以从s2中pop一个元素int front = Pop(s2);System.out.println(front);} else {System.out.println("ERROR:Empty");}} else if (opr.equals("T")) {break;}}}/*** 判断堆栈S是否已满,返回1或0* @param s 栈* @return 返回 1 表示满,返回 0 表示没有满*/public static  int IsFull(Stack<Integer> s,int r){if(s.size() >= r){return 1;}return 0;}/*** 判断堆栈S是否为空,返回1或0;* @param s 栈* @return 返回 1 表示空,返回 0 表示不为空*/public static int IsEmpty (Stack<Integer> s ){if(s.empty()){return 1;}return 0;}/*** 将元素item压入堆栈S;* @param s 栈* @param value 准备压入的数据*/public static void Push(Stack<Integer> s, int value ){s.push(value);}/*** 删除并返回S的栈顶元素。* @param s 栈* @return 返回的栈顶元素*/public static  int Pop(Stack<Integer> s ){return s.pop();}
}

测试

在这里插入图片描述

相关文章:

【刷题-PTA】堆栈模拟队列(代码+动态图解)

【刷题-PTA】堆栈模拟队列(代码动态图解) 文章目录 【刷题-PTA】堆栈模拟队列(代码动态图解)题目输入格式:输出格式:输入样例:输出样例: 分析题目区分两栈解题思路伪代码动图演示代码测试 题目 题目描述 : 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 …...

FileUpload控件上传文件时出现 不支持给定路径的格式.的解决方法

正常代码&#xff0c;部署到server 2012时&#xff0c;在上传音频mp3文件时&#xff0c;显示错误“不支持给定路径的格式”&#xff0c;上传控件使用FileUpload控件&#xff1a; 因为程序之前是正常的&#xff0c;因此应该不是程序的问题。 上传时&#xff0c;发现在选择文件时…...

这两天的一些碎碎念

一直以来我都不算是一个非常热爱运维岗位的一个人&#xff0c;其实本行工作对于我来说只是一个工作。运维的广度很大&#xff0c;说什么工作了7年了&#xff0c;可最终总感觉还曾是一窍不通。 什么shell啊&#xff0c;什么python啊&#xff0c;什么大数据啊&#xff0c;7年里&a…...

Unity 最新DOTS系列之《Baking与Baker的详解》

Unity DOTS Baking与Baker详解 最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念&#xff0c;方便大家上手学习掌握Unity DOTS开发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&…...

【Tensorflow 2.12 简单智能商城商品推荐系统搭建】

Tensorflow 2.12 简单智能商城商品推荐系统搭建 前言架构数据召回排序部署调用结尾 前言 基于 Tensorflow 2.12 搭建一个简单的智能商城商品推荐系统demo~ 主要包含6个部分&#xff0c;首先是简单介绍系统架构&#xff0c;接着是训练数据收集、处理&#xff0c;然后是召回模型、…...

Unity 单例-接口模式

单例-接口模式 使用接口方式实现的单例可以继承其它类&#xff0c;更加方便 using System.Collections; using System.Collections.Generic; using UniRx; using UniRx.Triggers; using UnityEngine; namespace ZYF {public interface ISingleton<TMono> where TMono : M…...

【Java 进阶篇】Java XML解析:从入门到精通

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据格式&#xff0c;用于存储和交换数据。在Java中&#xff0c;XML解析是一项重要的任务&#xff0c;它允许您从XML文档中提取和操作数据。本篇博客将从基础开始&#xff0c;详细介绍如何在Java中解析XML文档&#xff0…...

【图像配准】Canny边缘检测+模板配准红外可见光双路数据

研究目的 最近在做无人机遥感红外和可见光双路数据配准&#xff0c;由于红外相机视野范围较小&#xff0c;因此配准的目的主要是在可见光的视野范围内&#xff0c;裁剪出红外图像对应的部分&#xff0c;同时&#xff0c;保持可见光的高分辨率不变。 本文思路 本文尝试使用Ca…...

关于单机流程编排技术——docker compose安装使用的问题

最近在学习docker相关的东西&#xff0c;当我在docker上部署了一个nest应用&#xff0c;其中该应用中依赖了一个基于mysql镜像的容器&#xff0c;一个基于redis镜像的容器。那我&#xff0c;当我进行部署上线时&#xff0c;在启动nest容器时&#xff0c;必须保证redis容器和mys…...

Google Chrome的新“IP保护”功能将隐藏用户的IP地址

导语&#xff1a;在保护用户隐私方面&#xff0c;Google Chrome正在测试一项名为“IP保护”的新功能。通过使用代理服务器掩盖用户的IP地址&#xff0c;这项功能能够增强用户的隐私保护。在意识到IP地址可能被用于秘密追踪后&#xff0c;Google希望在确保用户隐私的同时&#x…...

做机器视觉工程师,苏州德创能不能去工作?

每一家公司都有自身特点&#xff0c;同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商&#xff0c;也是康耐视外包团队。那么苏州德创有哪些业务构成&#xff0c;业务的构成也是其招聘的主要人员的方向。 设备视觉供应商&#xff0c;如卓越&…...

交换机基础(二):VLAN 基础知识

一、VLAN 基础知识 虚拟局域网 (Virtual Local Area Network,VLAN) 是一种将局域网设 备从逻辑上划分成一个个网段&#xff0c;从而实现虚拟工作组的数据交换技术。 这一技术主要应用于3层交换机和路由器中&#xff0c;但主流应用还是在3层交换机中。 VLAN 是基于物理网络上构建…...

一个基于Vue3搭建的低代码数据可视化开发平台

JNPF是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 在JNPF中&#xff0c;至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件&#xff0c;这种情况下我们避免了重…...

经验风险最小化与结构风险最小化:优化机器学习模型的两种方法

随着大数据时代的到来&#xff0c;机器学习在各个领域中的应用越来越广泛。然而&#xff0c;在构建机器学习模型时&#xff0c;我们面临着两个主要的挑战&#xff1a;经验风险最小化和结构风险最小化。本文将深入探讨这两种方法&#xff0c;并分析它们在优化机器学习模型中的作…...

Java泛型中的问号是什么意思

通配符概念 因为 List 是泛型类&#xff0c;为了 表示各种泛型 List 的父类&#xff0c;可以使用类型通配符&#xff0c;类型通配符使用问号(?)表示&#xff0c;将一个问号当做类型元素传递个 List&#xff0c;可以表示为 List<?>,意思是 元素类型未知的 List&#xf…...

粤嵌实训医疗项目day02(Vue + SpringBoot)

目录 一、创建vue项目并运行 二、vue-cli中的路由使用 三、element-ui框架、实现页面布局以及vue-路由 四、前端登录页面 五、user登录后端接口完善【后端】 六、user登录前端-请求工具-请求发起【前端】 七、请求的跨域-访问策略 八、完善项目的页面布局、导航菜单以及…...

又是一年1024程序员日

程序员节是每年的10月24日&#xff0c;这是一个特殊的节日&#xff0c;旨在庆祝和表彰程序员们对科技和社会的贡献。作为技术领域的从业者&#xff0c;程序员们在现代社会中扮演着重要的角色&#xff0c;他们致力于编写、测试和维护软件代码&#xff0c;为我们的生活带来了无数…...

acme.sh签发和部署ZeroSSL泛域名证书

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本&#xff0c;他可以自动生成Let’s Encrypt 的证书…...

Calibre拾遗:FDI (Foreign Database Interface)系统简介

Calibre是强大的GDS处理工具&#xff0c;包括查看&#xff0c;验证&#xff0c;分析等操作&#xff0c;操作由浅入深&#xff0c;除过手动编辑GDS的不是很灵活外&#xff0c;其他各种命令和操作策略&#xff0c;都是远&#xff08;遥&#xff09;远&#xff08;遥&#xff09;走…...

记一次渗透测试事件

一、漏洞发现 拿到登录的接口&#xff0c;丢到sqlmap里面跑一把&#xff0c;发现延时注入 进一步查询&#xff0c;发现是sa权限&#xff0c;直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了&#xff0c;直接进行nc 反弹 执行base64 加密后的powershell命令&…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...