Java利用栈实现二进制和十进制、八进制、十六进制的互相转换
点击进入尚硅谷数据结构和算法Java代码导航
package stack;
import java.util.Stack;
public class Sequence {
int MAX;
int len;
int[] data;
int top;
public Sequence(int m) {
this.MAX = m;
this.data = new int[m];
this.top = -1;
this.len = 0;
}
//压栈
public boolean push(int temp) {
if(this.len == this.MAX) {
System.out.println("Push failed.");
return false;
}
top++;
len++;
data[top] = temp;
return true;
}
//出栈
public int pop() {
int temp = data[top];
top--;
len--;
return temp;
}
//获取top数据
public int getTop() {
return data[top];
}
//二进制转十进制
public int binTo10() {
int sum = 0;
for(int i=0; len!=0; i++) {
sum += Math.pow(2, i) * pop();
}
System.out.println(sum);
return sum;
}
//十进制转二进制
public Sequence tenTo2(int k) {
Sequence s = new Sequence(this.MAX*4);
while(k != 0) {
s.push(k % 2);
k /= 2;
}
for(int i=0; s.len!=0; i++) {
System.out.print(s.pop());
}
return s;
}
//二进制转八进制
public Sequence binTo8() {
Sequence s = new Sequence(this.MAX);
int sum = 0;
while(this.len!=0) {
sum = 0;
if(this.len >= 3) {
//大于三位取三位,小于三位取剩下所有的
for(int j=0; j<3; j++) {
sum += Math.pow(2, j) * pop();
}
}else {
for(int j=0; this.len!=0; j++) {
sum += Math.pow(2, j) * pop();
}
}
s.push(sum);
}
for(int i=0; s.len!=0; i++) {
System.out.print(s.pop());
}
return s;
}
//八进制转二进制
public Sequence eightTo2() {
Sequence s = new Sequence((this.MAX)*3);
int temp;
while(this.len!=0) {
//这个循环是为了取出所有数
temp = this.pop();
for(int i=0; i<3; i++) {
//八进制的每位数转为二进制的三位,所以要三次压栈
if(temp != 0) {
s.push(temp % 2);
temp /= 2;
}else {
//数不足用0补全
s.push(0);
}
}
}
while(s.getTop() == 0) {
s.pop();
}
for(int i=0; s.len!=0; i++) {
System.out.print(s.pop());
}
return s;
}
//二进制转十六进制
public Sequence binTo16() {
Sequence s = new Sequence(MAX);
int sum;
while(this.len != 0) {
sum = 0;
if(this.len>=4) {
for(int i=0; i<4; i++) {
sum += Math.pow(2, i) * pop();
}
}else {
for(int i=0; this.len!=0; i++) {
sum += Math.pow(2, i) * pop();
}
}
s.push(sum);
}
for(int i=0; s.len!=0; i++) {
System.out.print(tenTo16(s.pop()));
}
return s;
}
//十进制转为十六进制,简单的方法:Integer.toHexString()
public char tenTo16(int k) {
if(k<10) {
return (char)k;
}else {
switch(k) {
case 10: return 'A';
case 11: return 'B';
case 12: return 'C';
case 13: return 'D';
case 14: return 'E';
case 15: return 'F';
default: return 'G';
}
}
}
//十六进制转二进制
public Sequence SixteenTo2(String str) {
Sequence s = new Sequence(str.length()*4);
int temp;
for(int i=str.length(); i>0; i--) {
temp = SixteenTo10(str.substring(i-1, i));
for(int j=0; j<4; j++) {
if(temp != 0) {
s.push(temp % 2);
temp /= 2;
}else {
s.push(0);
}
}
}
while(s.getTop() == 0) {
s.pop();
}
for(int i=0; s.len!=0; i++) {
System.out.print(s.pop());
}
return s;
}
//十六进制转十进制,简单方法:Integer.parseInt(String s, int radix)
public int SixteenTo10(String str) {
int k = 0;
switch(str) {
case "0": k = 0; break;
case "1": k = 1; break;
case "2": k = 2; break;
case "3": k = 3; break;
case "4": k = 4; break;
case "5": k = 5; break;
case "6": k = 6; break;
case "7": k = 7; break;
case "8": k = 8; break;
case "9": k = 9; break;
case "A": k = 10; break;
case "B": k = 11; break;
case "C": k = 12; break;
case "D": k = 13; break;
case "E": k = 14; break;
case "F": k = 15; break;
}
return k;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Sequence se = new Sequence(20);
// se.push(1);
// se.push(0);
// se.push(1);
// se.push(0);
// se.push(1);
// se.push(0);
// se.push(1);
// se.push(1);
// se.bin28();
// se.binTo10();
// se.binTo16();
// se.push(2);
// se.push(5);
// se.push(3);
// se.eightTo2();
se.SixteenTo2("ABC");
}
}
还没有评论,来说两句吧...