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

news2024/9/21 22:32:53

一、前言:

  这是怀化学院的: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>当需要转换的进制是十进制时:(这个当然不用说肯定可以)

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

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

相关文章

前端---CSS篇(详解CSS)

1.CSS简介 CSS(Cascading Style Sheets)层叠样式表&#xff0c;是用来为结构化文档&#xff08;HTML、XML等应用&#xff09;添加样式,比如字体、颜色、大小、间距的计算机语言。CSS目前已经发展到了CSS3.0了。 2.CSS导入方式 CSS有三种导入方式&#xff1a; 1.行内样式&am…

基于SSM的电商购物网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

类和对象——(2)类

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 只虽然夜晚很长&#xff0c;但天…

鸿蒙4.0开发笔记之ArkTS语法基础@Entry@Component自定义组件的使用(九)

文章目录 一、自定义组件概述1、什么是自定义组件2、自定义组件的优点 二、创建自定义组件1、自定义组件的结构2、自定义组件要点3、成员变量的创建4、参数传递规则 三、练习案例 一、自定义组件概述 1、什么是自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xf…

CodeTON Round #7 (Div. 1 + Div. 2)

A.jagged Swaps 题意&#xff1a; 给出一个包含 n n n个数字的序列&#xff0c;每次可以选择一个同时大于左右两边相邻的数字&#xff0c;将这个数字与它右边的数字交换&#xff0c;问能否在经过若干次操作后使序列变为升序。 分析&#xff1a; 由于交换只能向后进行&#…

OpenCV | 模版匹配

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 模版匹配 模版匹配和卷积原理很像&#xff0c;模版在原图像上从原点开始滑动&#xff0c;计算模版与&#xff08;图像被模版覆盖的地方&#xff…

SAP VL01N Error VL 367

在VL01N 创建交货单的时候&#xff0c;报错&#xff1a;An item with no delivery quantity is not permitted. Item will be deleted. 第一种情况&#xff1a; 1.首先MMBEcheck 可用库存&#xff0c;非限制使用库存是否充足 注意&#xff1a;这里框出来的交货库存也是非限制…

HMM预习中文版

马尔可夫模型 在之前的笔记中&#xff0c;我们讨论了贝叶斯网络&#xff0c;以及它们如何被用于紧凑地表示随机变量之间的关系。现在&#xff0c;我们将介绍一个与之紧密相关的结构&#xff0c;称为马尔可夫模型&#xff0c;对于本课程的目的&#xff0c;可以将其视为类似于链…

位运算算法【1】

文章目录 &#x1f34a;面试题 01.01. 判定字符是否唯一&#x1f96d;题目&#x1f351;算法原理&#x1f95d;解法一&#xff1a;哈希表&#x1f95d;解法二&#xff1a;位图 &#x1f951;代码实现 &#x1f33d;268. 丢失的数字&#x1f96c;题目&#x1f344;算法原理&…

多线程(补充知识)

STL库&#xff0c;智能指针和线程安全 STL中的容器是否是线程安全的? 不是. 原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认…

(Linux2.6内核)进程调度队列与切换

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 我们首先来了解几个概念 1. 进程在CPU上运行的时候&#xff0c;一定要运行完才行吗&#xff1f;答案是否定的&#xff0c;我们大部分的操作系统&#xff0c;主流就是分时操作系统&#xff0c;即基于时间片进程轮转执行的。 …

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈&#xff1a;这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”&#xff0c;那就厉害了&#xff0c;我们的故事就开始了。 本题要求你实现一个程序&#xff0c;自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中&#xff0c;我们已经以钢铁产业产品缺陷检测数据场景为基准&#xff0c;陆续开发构建了多款目标检测模型&#xff0c;感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否&#xff1f;基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

人工智能原理复习--知识表示(一)

文章目录 上一篇知识概述命题逻辑谓词逻辑谓词逻辑的应用 下一篇 上一篇 人工智能原理复习–绪论 知识概述 知识就是人类认识自然界的精神产物&#xff0c;是人类进行智能活动的基础。 是经过加工的信息&#xff0c;包括事实、信念和启发式规则。 分类&#xff1a; 按作用可…

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用&#xff0c;并理解缓冲区中的数据处理模型&#xff0c;掌握Channel的作用&#xff0c;并结合缓冲区实现数据I/O操作&#xff0c;理解文件锁的作用&#xff0c;并且掌握字符编码处理支持类的使用&#xff0c;掌握Reactor设计模型&#xff0…

深信服AD负载均衡频繁掉线故障分析

一个由114.114.114.114引起的AD异常 客户反馈深信服负载均衡链路频繁掉线&#xff0c;具体故障现象如下 可以获取到IP地址、网关 两分钟掉一次&#xff0c;持续一个多月&#xff0c;求IT的心理阴影面积&#xff01; 链路监视器只设置了一个114.114.114.114 处理流程&#xff…

Ps:子路径的上下排列以及对齐与分布

不论是一个形状图层&#xff08;或图层的矢量蒙版&#xff09;上的多个形状还是同一路径层上多个路径&#xff0c;只要对应“路径”面板的一个路径层&#xff0c;可以将这些路径称为该路径层的“子路径”&#xff0c;也称为“组件”。 当一个路径层上有两个以上的子路径时&…

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

SELinux零知识学习三十七、SELinux策略语言之约束(1)

接前一篇文章:SELinux零知识学习三十六、SELinux策略语言之角色和用户(7) 四、SELinux策略语言之约束 SELinux对策略允许的访问提供了更严格的约束机制,不管策略的allow规则如何。 1. 近距离查看访问决定算法 为了理解约束的用途,先来看一下SELinux Linux安全模块(Lin…