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];//实现顺序栈的数组初始容量100
        top=-1; //栈空的时候指向-1下标
    }
    //防止初始化时,原来的数组长度不满足题目要求
    public void expand(int []data) {
        //导入了包直接类调用
        //将原来数组长度扩容原来长度的2倍
        if (maxSize == data.length) {
            Arrays.copyOf(data, data.length * 2);
        }
    }
    //实现接口中的所有抽象方法
    //压栈
    @Override
    public int push(int item) {
        if(top!=(data.length-1)){
            data[++top]=item;  //要先让top++自增,也就是给数组第一个元素赋值
            return item;
        }else{
            System.out.println("栈已满");
            return 0;
        }
    }
    //出栈
    @Override
    public int pop() {
        int item=0;
        if(!isEmpty()){
            item=data[top--];
        }
        return item;  //返回出栈的值,因为top已经减1了这时
    }
    //取出栈顶元素
    @Override
    public int peek() {
      int item =0;
      if(!isEmpty()){
          item=data[top];  //top指向的元素永远是栈顶的那个
      }
        return item;
    }
    //求栈的长度
    @Override
    public int size() {
        return (this.top+1);  //自己想一下逻辑就知道了
    }
    //判断栈是否为空
    @Override
    public 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){
        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{
                System.out.print(x);  //先输出栈顶元素再出栈,也就是top--
            }
            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>当需要转换的进制是十进制时:(这个当然不用说肯定可以)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络入门

1.卷积神经网络基本结构结构 卷积神经网络采用类似于动物视觉皮层组织中的神经元的连接模式&#xff0c;是一类包含卷积神经网络且具有深度结构的前馈神经网络。其基本结构如图2-1所示&#xff0c;大致包括&#xff1a;卷积层&#xff0c;激活函数&#xff0c;池化层&#xff…

【Linux下基本指令——(1)】

Linux下基本指令——&#xff08;1&#xff09; 一. ls 指令1.1.语法&#xff1a;1.2.功能&#xff1a;1.3.常用选项&#xff1a;1.4.举例&#xff1a;1.5.Xshell7展示 二. pwd 命令2.1.语法: 2.2.功能&#xff1a;2.3.常用选项&#xff1a;2.4.Xshell7展示 三. cd 指令3.1.语法…

服务器bash进程占用cpu过多疑似中挖矿病毒记录

发现过程 因为我有使用conky的习惯&#xff0c;也就是在桌面上会显示cpu和内存的占用情况&#xff0c;由于服务器不止我一个人使用&#xff0c;最近发现好几次我同学的账户下的bash进程占用特别多&#xff0c;问了他之后&#xff0c;他也说他几次都是没有使用过bash相关服务&a…

Rabbitmq发送邮件并消费邮件

&#x1f4d1;前言 本文主要是【Rabbitmq】——Rabbitmq发送邮件并消费邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

软件设计开发规程文件

《软件设计开发规程文件》 目的&#xff1a;为需求设计、开发、实现解决方案。

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造&#xff0c;可以帮助他们在Mac上测量和可视化黄金比例&#xff0c;从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧&#xff0c;可以驻留在系统的菜单栏之上&#xff0c;随时提供给用户调用。 拥有独…

通过git上传文件到github仓库

一、新建github仓库 访问github官网&#xff1a;GitHub: Let’s build from here GitHub 点击个人头像&#xff0c;在右侧栏选择Your repositories。 点击New&#xff0c;新建一个github仓库。 创建Repository name仓库名&#xff0c;如果这个仓库名已经创建过的话&#xff…

Android中的多进程

在Android中也可以像pc一样开启多进程&#xff0c;这在android的编程中通常是比较少见的&#xff0c;以为在一个app基本上都是单进程工作就已经足够了&#xff0c;有一些特殊的场景&#xff0c;我们需要用多进程来做一些额外的工作&#xff0c;比如下载工作等。 在Android的An…

美创科技受邀亮相第二届全球数字贸易博览会

11月23日-27日&#xff0c;由浙江省人民政府、商务部共同主办的第二届全球数字贸易博览会&#xff08;以下简称“数贸会”&#xff09;圆满落幕。围绕“国家级、国际性、数贸味”的目标定位&#xff0c;以“数字贸易 商通全球”为主题&#xff0c;数贸会重点展示数字贸易全产业…

Android控件全解手册 - 任意View缩放平移工具-源码

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

[Python入门系列之十一]在windows上安装OpenCV

1-安装OpenCV 如果是python3.7–python3.9(已测试)&#xff0c;直接安装即可 注&#xff1a;conda需要先激活虚拟环境后再安装 pip install opencv-python如果安装速度慢&#xff0c;使用下面的指令&#xff1a; pip install opencv-python -i https://pypi.tuna.tsinghua.e…

【鲁班猫创意大赛2期】基于鲁班猫的幼儿Al监督系统

【鲁班猫创意大赛2期】基于鲁班猫的幼儿Al监督系统 作品介绍 本作品名称为“基于鲁班猫的幼儿 Al 学习助手”&#xff08;系统总体框图如下图&#xff09;&#xff0c;作品应用群体为幼儿群体&#xff0c;主要功能&#xff1a;通过实时坐姿检测&#xff0c;防止坐姿不端正导致…

Linux详解——常用命令(二)

目录 一、常用命令 1.进程相关命令 2.vi命令 3.软件相关命令 RPM命令 YUM命令 4.用户和组相关命令 5.权限相关命令 一、常用命令 1.进程相关命令 # 1.ps 询在当前控制台上运行的进程 ps -aux 说明:查询系统中所有运行的进程&#xff0c;包括后台进程&#xff0c;其…

Git删除临时分支

愿所有美好如期而遇 软件开发过程中&#xff0c;总有功能要添加进来&#xff0c;当我们有一个功能开发了一半的时候&#xff0c;产品经理说这个功能不需要了&#xff0c;尽管很无奈&#xff0c;但还是要删除&#xff0c;我开发到一半的分支如何删除呢&#xff1f; 所以需要使用…

seurat读取不同数据格式以创建Seurat单细胞对象

挖掘GEO公共单细胞数据集时&#xff0c;会遇到常见各种单细胞测序数据格式。现总结如下&#xff0c;方便自己日后调用&#xff0c;以创建Seurat对象 &#xff08;1&#xff09;barcodes.tsv.gz、features.tsv.gz、matrix.mtx.gz &#xff08;2&#xff09;表达矩阵 &#xff08…

春安航运 App Tech Support

春安航运app是一款客户可以实时查看合同进度和自助开票&#xff0c;并且提供航运实用小工具的手机软件。软件的主要功能包括合同查询功能(合同详细&#xff0c;操作船代&#xff0c;分享&#xff0c;合同执行状态&#xff0c;合同执行航线)&#xff0c; 费用结算功能(应付明细&…

gRPC Java、Go、PHP使用例子

文章目录 1、Protocol Buffers定义接口1.1、编写接口服务1.2、Protobuf基础数据类型 2、服务器端实现2.1、生成gRPC服务类2.2、Java服务器端实现 3、java、go、php客户端实现3.1、Java客户端实现3.2、Go客户端实现3.3、PHP客户端实现 4、运行效果 本文例子是在Window平台测试&a…

CI/CD 构建中能保护好 SSHKEY吗?

目录 背景 方案 编码存储 逐行存储 合并存储 打马赛克 结论 背景 使用极狐GitLab CI/CD&#xff0c;在部署方面&#xff0c;主要有两种方式&#xff1a; 部署到K8S集群 Push模式&#xff1a;流水线通过kubectl执行命令部署&#xff0c;这需要把K8S的权限给流水线&#xf…

htop命令中显示相同进程的解决方案

使用 htop 的过程中会发现有很多同样的进程被标注了绿色大量显示。如下图所示。 这使得在大量程序运行时想要找到需要观察的进程变的困难。本文介绍了如何省略这些重复现实的进程。 输入 htop&#xff0c;显示出 htop 界面。按下 F2 键&#xff0c;进入 Setup 模式点击 Displa…