Java之顺序栈实现数制转换问题

一、前言:

  这是怀化学院的:Java数据结构中的一道中等编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完成功,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。

二、题目要求如下:

(第 11 题) 数制转换(难度系数75)

数制转换

标准输入输出
题目描述:
数制转换。(要求采用栈实现,练习进栈入栈函数的编写)
输入:
输入的第一行包含两个数,n,d
n表示要转换的数的个数
d表示要转换成的进制数
接下来是n个十进制数

输出:
对每一测试用例,用一行输出数制转换后的结果
输入样例:
2 8
123
213
输出样例:
173
325

三、代码实现(这里我是用顺序栈去实现数制转换,基本原理代码解释在注释中) 

(1)自定义基础栈接口:

package com.feisi.convert;
//自定义一个栈接口,对栈的所有操作都在其中
public interface Stack {//都是抽象方法public abstract int push(int item);  //入栈public abstract int pop();   //出栈public abstract int peek(); //取出栈顶元素public abstract int size(); //返回栈中的元素个数public abstract boolean isEmpty(); //判断栈是否为空}

(2) 自定义顺序栈类,并让它去实现自定义基础栈接口:(里面包含了顺序栈的基本操作方法)

package com.feisi.convert;
import java.util.Arrays;  //用里面的扩容数组的方法,所以要导入这个包
public class MyStack implements Stack {//用private封装,安全private int maxSize; //顺序栈的容量private int[] data;  //自己创建一个数组,用来存储顺序栈中的数据元素private int top;   //用来指向顺序栈的栈顶//用构造方法来初始化栈public MyStack(){data=new int[100];//实现顺序栈的数组初始容量100top=-1; //栈空的时候指向-1下标}//防止初始化时,原来的数组长度不满足题目要求public void expand(int []data) {this.maxSize=size(); //栈的实际容量//导入了包直接类调用//将原来数组长度扩容原来长度的2倍if (maxSize == data.length) {Arrays.copyOf(data, data.length * 2);}}//实现接口中的所有抽象方法//压栈@Overridepublic int push(int item) {if(top!=(data.length-1)){data[++top]=item;  //要先让top++自增,也就是给数组第一个元素赋值return item;}else{System.out.println("栈已满");return 0;}}//出栈@Overridepublic int pop() {int item=0;if(!isEmpty()){item=data[top--];}return item;  //返回出栈的值,因为top已经减1了这时}//取出栈顶元素@Overridepublic int peek() {int item =0;if(!isEmpty()){item=data[top];  //top指向的元素永远是栈顶的那个}return item;}//求栈的长度@Overridepublic int size() {return (this.top+1);  //自己想一下逻辑就知道了}//判断栈是否为空@Overridepublic boolean isEmpty() {if(top==-1){return true;}else{return false;}}
}

(3) 自定义实现栈类:里面有数制转化的方法,在测试类去创建实例,调用它里方法并完成数制的转换。

package com.feisi.convert;public class ImplementStack {MyStack myStack = new MyStack();public void convert(int num,int d){//记录余数int remainder=0;  //注意不能写访问修饰符public等等,因为局部变量//记录商(取整后的)int sum=num;while(sum>=d){  //因为只要商不小于对应的进制数,就要继续对进制数取余remainder = sum % d;  //传进的十进制数对进制数取余(为啥这样可以自己了解进制转换原理)myStack.push(remainder); //将第一个余数压入栈中,因为取余后逆置输出,刚好最后入栈的余数第一个先出栈(栈的原理)sum=sum/d;  //更新商,进行下一次取余}myStack.push(sum);  //这一步其实就是把最后小于进制数的商压栈,因为最后的余数就是商的本身(自己理解理解)}//此方法最大作用就是依次把余数弹栈public void printf(int d){int i=1; //记录是二进制:如果连续输出四个就要输出空格分隔开,再进行输出while(!myStack.isEmpty()){int x=myStack.peek();if((d==16)&&x==10||x==11||x==12||x==13||x==14||x==15) {   //该地方用来输出当转化成16进制的格式代码if(x==10){System.out.print('A');}else if(x==11){System.out.print('B');}else if(x==12){System.out.print('C');}else if(x==13){System.out.print('D');}else if(x==14){System.out.print('E');}else if(x==15){System.out.print('F');}}else{if(d==2&&i==5){  //控制二进制时输出四个四个一组System.out.print(" ");System.out.print(x);  //先输出栈顶元素再出栈,也就是top--i++;}else {System.out.print(x);i++;}}myStack.pop(); //每次输出栈顶元素后记得出栈噢}System.out.println();}
}

(4)自定义测试类,用来完成各数制转换的测试:

package com.feisi.test;import com.feisi.convert.ImplementStack;
import com.feisi.convert.MyStack;//因为测试类与自己创建的栈类不在同一个包里,所以我才导包
import java.util.Scanner;
public class Test_Stack {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();  //代表要转换的十进制数的个数int d = sc.nextInt();  //代表所要转的某种进制int num[] = new int[n];  //存储n个十进制数for (int i = 0; i < n; i++) {num[i] = sc.nextInt();}for(int j=0;j<num.length;j++){ImplementStack i = new ImplementStack();i.convert(num[j],d);i.printf(d);}}
}

四、所有情况的代码运行情况:

<1>当需要转换的进制是二进制时:(今天修改了一下空格问题,但还是不是很完美)

<2> 当需要转换的进制是八进制时:

<3> 当需要转换的进制是十六进制时:

<4>当需要转换的进制是十进制时:(这个当然不用说肯定可以)

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

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

相关文章

数字人担任展会虚拟主持人,如何释放大会新活力?

近日&#xff0c;虚拟主持人谷小雨解锁新身份&#xff0c;作为第二届全球数字贸易博览会的“数字新闻官”为大众播报展会的热门新闻话题&#xff0c;带领大众探索未来数字贸易的无限可能。 *图片源于网络 随着元宇宙的概念更多地深入各领域&#xff0c;数字人多次以虚拟主持人或…

iframe内存泄露问题

场景 左边导航栏&#xff0c;顶部tab标签&#xff0c;下面的iframe是点击导航菜单生成的&#xff0c;顶部的tab标签对应每一个打开的菜单名称&#xff0c;可以点击关闭 问题 内存泄漏 解决 const delIframeDom document.getElementById(menuId);if (delIframeDom) {delI…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法&#xff0c;具体请参考《MySQL主从数据库搭建》这篇文章&#xff0c;本文主要讲述双主双从&#xff0c;双主多从集群的搭建方式。 这里要问一个问题&#xff0c;为什么MySQL要搭建数据库集群呢&#xff1f;我想应该有以下几点原因&…

面试题:Spring 中获取 Bean 的方式有哪些?

文章目录 前言1、在初始化时保存ApplicationContext对象2、通过Spring提供的工具类获取ApplicationContext对象3、实现接口ApplicationContextAware&#xff08;推荐&#xff09;4、继承自抽象类ApplicationObjectSupport5、继承自抽象类WebApplicationObjectSupport6、使用Bea…

【Python深度学习第二版】学习笔记之——什么是深度学习

机器学习是将输入&#xff08;比如图像&#xff09;映射到目标&#xff08;比如标签“猫”&#xff09;的过程。 这一过程是通过观察许多输入和目标的示例来完成的。 深度神经网络通过一系列简单的数据变换&#xff08;层&#xff09;来实现这种输入到目标的映射&#xff0c;这…

日期对象与节点操作

1.日期对象 1.1实例化 // 实例化const date new Date()console.log(date);// 返回指定时间const date1 new Date(2022-5-1 08:30:00)console.log(date1);1.2日期对象方法 1.3时间戳 三种获取时间戳的方法 const date new Date()console.log(date.getTime());console.log(ne…

MaskDINO环境搭建与模型测试

1、环境搭建 1、构建虚拟环境安装torch conda create -n mmdetsam python3.8 -y conda activate mmdetsampip install torch1.10.0cu102 torchvision0.11.0cu102 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi…

【计算机网络学习之路】序列化,反序列化和初识协议

文章目录 前言一. 序列化和反序列化1.自己实现2. JSON 二. 初识协议结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇博文讲解应用层的序列化和反序列化&#xff0c;还有见一…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…

大地测量乙级资质申请条件

整理一期关于测绘资质大地测量乙级资质的申请要求 测绘资质是由测绘资质主管部门自然资源部制定的 想要了解标准、正规的申请条件&#xff0c;可以到当地省份的政务网搜索测绘资质办理相关标准&#xff08;例如下图&#xff09; 1、通用标准 http://gi.mnr.gov.cn/202106/P02…

java 鸿鹄云商 SAAS云产品概述 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城免费搭建

【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营…

一秒开挂!纯 Python 开发 Web 应用

你好&#xff0c;我是 EarlGrey&#xff0c;喜欢翻译点东西&#xff0c;偶尔写写代码。 点击下方卡片关注我&#xff0c;一起向上进击&#xff0c;提升自我。后台回复关键词“电子书”&#xff0c;送你一份我收藏的电子书合集。 PyWebIO 是一个用于构建交互式 Web 应用程序的 P…

API网关

API网关的作用 下图显示了详细信息。 步骤 1 - 客户端向 API 网关发送 HTTP 请求。 步骤 2 - API 网关解析并验证 HTTP 请求中的属性。 步骤 3 - API 网关执行允许列表/拒绝列表检查。 步骤 4 - API 网关与身份提供商对话以进行身份​​验证和授权。 步骤 5 - 将速率限制规…

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…

浅析linux中的信号

人们往往将信号称为“软件中断”&#xff0c;它提供了异步事件的处理机制&#xff0c;这些事件可以来自系统外部&#xff08;如用户按下ctrlc产生中断符&#xff09;&#xff0c;也可能来自程序或者内核内部的执行动作&#xff08;如进程除零操作&#xff09;。进程收到信号&am…

AcWing 2816. 判断子序列

文章目录 AcWing 2816. 判断子序列我的思路CODE 欣赏大神代码给点思考 AcWing 2816. 判断子序列 题目链接&#xff1a;https://www.acwing.com/activity/content/problem/content/2981/ 我的思路 直接硬套模版&#xff0c;把两个指针两层循环写上如果匹配&#xff0c;记录数组…

汽车内饰灯不亮问题修复

车内饰灯不亮问题修复 最近换后座阅读灯火光闪了一下&#xff0c;保险丝短路&#xff0c;导致车内所有灯光&#xff0c;包括前后座阅读灯、后备箱灯都不亮了。 因为是所有灯都不亮&#xff0c;所以排除灯泡问题&#xff0c;网上查了下大概率是保险丝烧了。于是查了自己更换保…

idea下载与安装,以及创建一个项目写HelloWorld

1.idea下载 Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) Ultimate为旗舰版&#xff0c;功能全面&#xff0c;插件丰富&#xff0c;按年收费。 Community为社区版&#xff0c;免费试用&#xff0c;功能相对而言不是很丰富&#xff0c;但是不影…

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如: 我们在编写CI/…

Python 分解IP段获取所有IP(子网掩码)

需求 192.168.1.0/24,192.168.2.1-192.168.2.254,192.168.3.3 IP段格式已 "," 分割&#xff0c;获取所有IP 注意 1. 判断 IP 是否合规 2. 去除多余的字符&#xff0c;例如空格、换行符 3. 去重 代码 import re import ipaddressdef isIP(ip):p re.compile(^((…