Java日常学习:运用链栈实现进制转换

2023-05-16

一、简单介绍

        今天我就给大家带来java中的链栈实现进制转换的方法,该方法也是在学习栈的时候发现的,我们都知道在进制转换的时候有很多种方法,其中最常用也最容易理解的就是除基倒取余法,那么我们先来说说其原理构成。

        以转二进制为例,输入一个数n,每次用n除以2,把余数记下来,再用商去除以2......依次循环。直到商为0时结束,然后把余数倒着排列,就构成了转换后的二进制数,同样的道理,十进制转八进制、十六进制等。(这里少写了个0,最后换算结果是10001)

 

二、实现原理

        java顺序栈只允许在一端进行插入、删除和出栈,只允许操作的一段称为栈顶,另一端称为栈尾,运用这个特性我们可以知道,栈内元素是遵循先入后出,后入先出的原则,所以将依次计算的余数入栈,最后依次出栈,即可完成进制转换。

三、下面创建java顺序栈的代码

        1.创建一个SStack接口,添加判空isEmpty(),出栈puch(),入栈pop()方法。

public interface SStack<E> {

    public boolean isEmpty();

    public boolean push(E isEmpty);
    
    public E pop();

}

        ·2.创建一个 Node类,设置指针域和数据域。

public class Node<E> {
	public E data;               
    public Node<E> next;
    public Node(E data,Node<E> node)
    {
        this.data = data;
        this.next = node;
    }
    public Node(E data)
    {
        this(data,null); 
    }
    public Node()
    {
        this(null,null);
    }

}

         3.创建LinkedStackl类继承SStack接口,并实现未实现的方法。

public class LinkedStack<E> implements SStack<E> {

    private Node<E> top;//栈顶指针
        
    public boolean isEmpty() {
        return this.top == null?true:false;
    }
    @Override
    public boolean push(E element) {
        boolean flag = false;
        if (element != null){
            this.top = new Node<E>(element,this.top);
            flag = true;
        }
        return flag;
    }
    @Override
    public E pop() {
        E poped = null;
        if (! this.isEmpty()){
            poped = this.top.data;
            this.top = this.top.next;
        }
        return poped;
    } 
}

         4.创建测试类ConvertNumber,num为传入换算参数,创建workStack工作栈,运用resStr接收出栈元素,最后返回。

public class ConvertNumber {
    //转二进制
    private static String toBinary(int num) {
        StringBuffer resStr = new StringBuffer();
        SStack<String> workStack = new LinkedStack<String>();
        String str = "";
        for (int i = num;i > 0;i/=2){
            str = i % 2+str;
            workStack.push(str);
        }
        resStr.append(workStack.pop());
       return resStr.toString(); 
    }
    //转八进制
    private static String toHex(int num) {
        StringBuffer resStr = new StringBuffer();
        SStack<String> workStack = new LinkedStack<String>();
        String str = "";
        for (int i = num;i > 0;i/=8){
            str = i % 8+str;
            workStack.push(str);
        }
        resStr.append(workStack.pop());
       return resStr.toString();
    }
    //转十六进制
     private static String toOctonary(int num) {
        StringBuffer resStr = new StringBuffer();
        SStack<String> workStack = new LinkedStack<String>();
        String str = "";
        for (int i = num;i > 0;i/=16){
            str = i % 16+str;
            workStack.push(str);
        }
        resStr.append(workStack.pop());
       return resStr.toString();
    }
 public static void main(String[] args) {
        System.out.println(toBinary(17));
        System.out.println(toHex(17));
        System.out.println(toOctonary(17));
    }
}

         5.测试结果

 总体来说也是一个很不错的学习实用点,当然也会有更方便的方式来进行进制换算,以上文章仅仅用于分享,这也是本人第一次发文章请各位读者大大点个赞支持哦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java日常学习:运用链栈实现进制转换 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 如何在 Spring 属性中进行算术运算?

  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐