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

news2024/12/26 11:34:59

【刷题-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();
    }
}


测试

在这里插入图片描述

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

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

相关文章

新华三路由器+华为交换机,实现华为交换机指定端口访问外网

需求背景&#xff1a; 多台服务器使用华为交换机组建了局域网&#xff0c;需要让交换机的指定端口可以访问外网。 需求分析&#xff1a; 交换机组建的局域网是二层组网&#xff0c;需借助路由器接入外网&#xff0c;然后通过DHCP分配内网IP地址给交换机指定端口连接的设备。 …

[资源推荐] 关于计算机毕设的方法论(重庆大学吕昱峰)

第一次刷到这个up主的视频是之前搜cpu设计的时候 视频链接&#xff1a;https://www.bilibili.com/video/BV1j7411P7gt?p1&vd_source0e8431ba6fd78bb2215c36307a75ac1a 最近学校毕设要开题了&#xff0c;但是感觉对毕业设计这个东西还是比较模糊&#xff0c;应该做到什么…

QML自定义电池状进度条

效果: 百分比显示保留两位小数,通过iValue的数值来显示当前进度,注意为了保留小数总值取的是10000,所以你的iValue值也要乘上100 变量说明: cBorderColor:进度条外框的颜色 cContentColor:表示进度的小方块颜色 cTextColor:显示进度百分比的文字颜色 iValue:当前进度,为整数(…

低代码软件的价格考量:成本效益与投资回报

数字化转型的今天&#xff0c;我们常听到“低代码”这个概念&#xff0c;那低代码软件价格到底如何呢&#xff1f;很多厂商并没有公布软件价格情况&#xff0c;让很多企业在采购的时候也是一头雾水。当然&#xff0c;市场上也存在一些厂商公开透明价格&#xff0c;比如Zoho Cre…

皮卡丘靶场——暴力破解

暴力破解 1. 基于表单的暴力破解 在登陆界面随便使用账号密码进行登录&#xff0c;使用bp抓包发送Intruder 我们需要破解账号&#xff08;username&#xff09;和密码&#xff08;password&#xff09;&#xff0c;就应当选择ClusterBomb&#xff08;集束炸弹&#xff09;的攻击…

Java基础篇 | Java8流式编程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

pytorch_lightning:Validation sanity check: 0%| | 0/2 [00:00<?, ?it/s]

在使用Lighting架构辅助训练时&#xff0c;对于出现的下述情况的原因&#xff1a; 解释&#xff1a; 注意到“ Validation sanity check ”。这是因为Lightning在开始训练之前进行了两批验证。这是一种单元测试&#xff0c;以确保如果你在验证循环中有一个bug&#xff0c;你不…

微信小程序开发之投票管理及小程序UI的使用

目录 一、小程序UI 1.讲述 2. 介绍vantWeapp 3. 使用vantWeapp 安装 构建 依赖 引用 二、后端 1. 后端实体对象 2. 后端接口 3. 实现类 4. 请求处理类 三、前端 1. 定义路径 2. 页面引用 3. 页面 4. 页面美化 5. 数据 6. 效果展示 一、小程序UI 1.讲述 小…

IMU预积分的过程详解

一、IMU和相机数据融合保证位姿的有效性&#xff1a; 当运动过快时&#xff0c;相机会出现运动模糊&#xff0c;或者两帧之间重叠区域太少以至于无法进行特征匹配&#xff0c;所以纯视觉SLAM对快速的运动很敏感。而有了IMU&#xff0c;即使在相机数据无效的那段时间内&#xff…

python网络爬虫实例

目录 1、访问百度 2、输入单词百度翻译 3、豆瓣电影排行榜 4、豆瓣电影top250 5、下载美女壁纸 1、访问百度 from urllib.request import urlopen url"http://www.baidu.com" respurlopen(url)with open("mybaidu.html",mode"w") as f:f.wr…

Java面试(JVM篇)——JVM 面试题合集 深入理解JVM虚拟机

关于什么是JVM&#xff1f; 作用&#xff1a; 运⾏并管理Java 源码⽂件所⽣成的Class⽂件&#xff0c;在不同的操作系统上安装不同的JVM &#xff0c;从⽽实现了跨平台的保证。 ⼀般情况下&#xff0c;对于开发者⽽⾔&#xff0c;即使不熟悉JVM 的运⾏机制并不影响业务代码的…

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

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

进程中的权限是如何操作的

任何一个进程都有父进程。所以&#xff0c;整个进程其实就是一棵进程树。而拥有同一父进程的所有进程都具有兄弟关系。 struct task_struct __rcu *real_parent; /* real parent process */ struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ s…

超市商品管理系统 JAVA语言设计实现

目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的超市商品管理系统&#xff0c;超市区域模块、超市货架模块、商品类型模块、商品档案模块&#xff0c;分为用户网页端和管理后台&#xff0c;基于角色的访问控制&#xff0c;可将权限精确…

c++ qt连接操作sqlite

qt连接操作sqlite qt客户端编程,用到数据库的场景不多,但是部分项目还是需要数据库来保存同步数据,客户端用到的数据库,一般是sqlite。 Qt提供了数据库模块,但是qt本身的数据库模块并不好用,会有各种问题, 建议大家不要,可以自己封装数据库的操作。本篇博客介绍qt连接操…

AVS3:双向光流BIO

AVS3引入了双向光流&#xff08;BI-directional Optical flow,BIO&#xff09;技术&#xff0c;和H.266/VVC中的BDOF类似&#xff0c;BIO用于解决基于块的预测会存在块内某些区域仍会有偏差的现象导致需要划分更小的块。通过补偿小的像素区域的位移&#xff0c;BIO可以使用更大…

Leetcode刷题详解——最小覆盖子串

1. 题目链接&#xff1a;76. 最小覆盖子串 2. 题目描述&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xf…

VSCode 自动格式化

1.打开应用商店&#xff0c;搜索 prettier code formatter &#xff0c;选择第一个&#xff0c;点击安装。 2.安装完成后&#xff0c;点击文件&#xff0c;选择首选项&#xff0c;选择设置。 3.在搜索框内输入 save &#xff0c;勾选在保存时格式化文件。 4.随便打开一个文件&a…

FineReport制作任务日历

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 博主接触FineReport帆软报表有一段时间了&#xff0c;正好前几天做了一个任务日历的需求&#xff0c;把每天完成的任务量直观的展示在日历上&#xff0c;方便管理者更好的监控各业务的完成情况&#xff0c;做完后想着…

蜣螂优化(DBO)求解置换流水车间调度问题(PFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…