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");
	}

}

你可能感兴趣的:(数据结构,Java)