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) {//导入了包直接类调用//将原来数组长度扩容原来长度的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){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.hqwc.cn/news/227871.html

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

相关文章

【Python 训练营】N_12 打印菱形图案

题目 打印菱形图案 分析 先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列。 答案 # 方法一 for i in range(4):block **(2*i1)print({:^7}.format(block))…

使用shell快速查看电脑曾经连接过的WiFi密码

此方法只能查看以前连接过的wifi名称和对应的密码 查看连接过的WiFi名称netsh wlan show profiles查看具体的WiFi名称netsh wlan show profile name"你的wifi名称" keyclear

【Vue】Linux 运行 npm run serve 报错 vue-cli-service: Permission denied

问题描述 在Linux系统上运行npm run serve命令时&#xff0c;控制台报错&#xff1a; sudo npm run serve project50.1.0 serve vue-cli-service serve sh: 1: vue-cli-service: Permission denied错误截图如下&#xff1a; 原因分析 该错误是由于vue-cli-service文件权限不…

微信小程序+中草药分类+爬虫+keras

目录 1 介绍2 数据爬虫3 模型训练和验证3.1 模型训练3.2 导入一张图片进行验证 4 后台flask部署5 微信小程序 1 介绍 本项目使用深度学习模型&#xff0c;训练5种中药材数据集&#xff0c;然后将其集成到微信小程序&#xff0c;通过微信小程序拍照&#xff0c;将图片传输给后端…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

Linux的Sysfs 接口

一、sysfs接口 在linux系统中&#xff0c;用户空间访问驱动程序一般是以“设备文件”的方式通过“read/write/ioctl”访问&#xff0c;还有一种方式&#xff0c;可以通过echo的方式来直接控制硬件或者修改驱动&#xff0c;也能为底层驱动提供一个接口便于应用层调用&#xff0c…

超级详细的JDK 安装与配置(包含二个或多个JDK的同时安装)

一、JDK介绍 1、较常用的四个JDK版本 JDK8&#xff08;Java8JDK1.8&#xff09;&#xff0c;这个版本较为成熟稳定&#xff0c;是JDK的一个重要长期支持版本(LTS)&#xff0c;在生产环境中使用非常广泛&#xff1b; JDK11&#xff0c;增加了大量实用的新特性&#xff0c;包括…

Tensorflow-gpu保姆级安装教程(Win11, Anaconda3,Python3.9)

Tensorflow-gpu 保姆级安装教程&#xff08;Win11, Anaconda3&#xff0c;Python3.9&#xff09; 前言Tensorflow-gpu版本安装的准备工作(一)、查看电脑的显卡&#xff1a;(二) 、Anaconda的安装(三)、cuda下载和安装(四)、cudnn下载安装(五)、配置环境变量(六)、创建 tensorfl…

【C++深入浅出】STL之string用法详解

目录 一. 前言 二. STL概要 2.1 什么是STL 2.2 STL的六大组件 2.3 STL的缺陷 三. string类概述 3.1 什么是string类 3.2 为什么要使用string类 四. string类的使用 4.1 包含头文件 4.2 构造函数 4.3 赋值运算符重载 4.4 容量操作 4.5 访问/遍历操作 4.6 查找修改…

【C++初阶】第一站:C++入门基础(上) -- 良心详解

前言: 从这篇文章开始,将进入C阶段的学习&#xff0c;此篇文章是c的第一站的上半篇&#xff0c;讲述C初阶的知识 目录 什么是C C的发展史 C关键字(C98) 命名空间 命名空间定义 命名空间使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使…

【JavaSE】基础笔记 - 类和对象(上)

目录 1、面向对象的初步认知 1.1、什么是面向对象 1.2、面向对象与面向过程 2. 类定义和使用 2.1、简单认识类 2.2、类的定义格式 2.3、自定义类举例说明 2.3.1、定义一个狗类 2.3.2、定义一个学生类 3、类的实例化 3.1、什么是实例化 3.2、类和对象的说明 1、面向…

华为P40无法链接adb的解决记录

真的很讨厌华为的设备&#xff0c;很多东西啥设备都能跑得好好的&#xff0c;就华为会出问题&#xff0c;简直就是手机界的IE。 情况&#xff1a;突然无法链接adb到P40&#xff0c;拔插无效&#xff0c;关闭开发人员选项再打开也无效&#xff0c;撤销USB调试授权也无效&#x…