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…

apache-poi

excel类型 excel分为03版本和07版本 03版本 new HSSFWorkbook(); 优点&#xff1a;速度快 缺点&#xff1a;只能写入65536行数据 文件类型&#xff1a;.xls07版本 new XSSFWorkbook(); 优点&#xff1a;不限制写入数量 缺点&#xff1a;容易造成内存溢出(OOM)&#xff0c;速度…

程序员如何兼职?

首先&#xff0c;写博客和制作短视频是一个好方法。想象一下&#xff0c;你是一个资深的程序员&#xff0c;而你的博客就像是一个个人课堂&#xff0c;帮助那些初入编程领域的人理解各种编程概念和技巧。你可以分享你的工作经验、解决问题的过程&#xff0c;甚至可以分享一些有…

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;这…

RK3566RK3568 安卓11 在framework层进行串口通信

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#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;那么这个时…

字符串哈希

引例 题目描述 给定一个字符串 A A A 和一个字符串 B B B&#xff0c;求 B B B 在 A A A 中的出现次数。 A A A 和 B B B 中的字符均为英语大写字母或小写字母。 A A A 中不同位置出现的 B B B 可重叠。 输入格式 输入共两行&#xff0c;分别是字符串 A A A 和字符串…

企业微信,打造高效私域运营的重要工具!

随着数字时代的来临&#xff0c;私域运营已经成为了企业运营的重要环节。私域运营的核心在于人的运营&#xff0c;如何将目标用户牢牢地锁在自己的阵地上&#xff0c;并能够高效地运转起来&#xff0c;这是私域运营的关键所在。而企业微信&#xff0c;作为连接个人微信和企业微…

linux关于网络的一部分操作

目录 linux系统中一些简单的网络知识以及操作命令 查看ip命令 ping&#xff1a;检测与目标主机的连通性(现在很多服务器允许访问&#xff0c;但不允许ping发送的icmp包&#xff0c;防止探测) netstat&#xff1a;查看当前网络状态信息&#xff0c;包括服务及使用的端口 固定…

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

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

在uniCloud中使用正则表达式进行文本匹配和处理的方法

1. 正则表达式基础 正则表达式是一种用来匹配字符串的模式。它由普通字符&#xff08;例如字符 a 到 z&#xff09;和特殊字符&#xff08;称为"元字符"&#xff09;组成。以下是一些基本的正则表达式示例&#xff1a; 匹配邮箱的正则表达式&#xff1a;/^[\w-](\.…

2023关键事件

情境/背景&#xff1a; SAP系统未提供配置BOM解析功能&#xff0c;多个业务部长多次开会强调系统没有配置BOM查询功能&#xff0c;严重影响供应链物料管理。目标/任务&#xff1a; 实现SAP系统中配置BOM解析功能自开发定制程序行动/举措&#xff1a; 花费大量业余时间&#xff…

Python与设计模式--模板模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

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

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