在上一篇博文中我们实现了后进先出的数据结构——栈(Stack)。它后进先出的特性,使他成为程序设计中的有用工具。
在这篇博文中,我们将利用上一篇博文中实现的MyArrayStack去完成一个进制转换的任务。
任务目标:
给予一个非负十进制数N,要求转换成的2进制数。
算法原理:
假设二进制数N需要转换为d进制数,其算术原理为:
N = (N / d) * d + N%d
我们要将非负10进制数转换为2进制数,就是将该数用短除法除以2,取得每一位的余数,将余数按顺序压入栈中则输出的数就是需要转换的数。
如: 10进制数19需要转换成为2进制数
N | N/2 | N%2 |
---|---|---|
19 | 9 | 1 |
9 | 4 | 1 |
4 | 2 | 0 |
2 | 1 | 0 |
1 | 0 | 1 |
所以二进制数就是将余数从高位到低位输出,即10011
10011 = 1* 2^4+0+0+1 *2^1 +1 = 16 +2 +1 = 19
因此算法十分简单,只需要将低位到高位的余数压入栈中,再从栈顶依次弹出数字即是需要转换的进制数了。
代码实现如下:
public class DecToBinaryTest { //建立类变量stack用来存储余数 static MyArrayStack<Integer> stack; public static void main(String[] args) { // TODO Auto-generated method stub stack = new MyArrayStack<Integer>(); System.out.PRintln(getBinaryForm(19)); } private static String getBinaryForm(int decNum){ //如果输入的10进制数为负数则抛出异常 if(decNum<0) throw new IllegalArgumentException(); StringBuffer sb = new StringBuffer(); while(decNum !=0){ //当decNum不为0时,迭代地除2的余数压入栈中 Integer r = decNum % 2; decNum = decNum /2; stack.push(r); } //将栈中的元素弹出并放入到字符串中输出 while(!stack.isEmpty()) sb.append(stack.pop()); return sb.toString(); }}本博文源码下载地址,内含MyArrayStack源码及进制转换源码,欢迎下载测试。
新闻热点
疑难解答