用栈数据结构实现进制转换

用栈数据结构实现进制转换
栈结构:先进后出(First in Last out),根据这个特点可以实现十进制转为二进制、十进制转为八进制、十进制转为十六进制。
MyStack接口

package qianyu.ArrayStack;

public interface MyStack {
	//栈中一些常用的方法操作
	int getSize();
	boolean isEmpty();
	void push(Object e); //压栈
	Object pop();  //出栈
	Object peek(); //返回栈顶元素
}

MyStacl接口实现类->MyStackImpl

package qianyu.ArrayStack;

public class MyStackImpl implements MyStack {
	private Object[] elements; //定义数组保存堆栈信息
	private static final int DEFAULT_CAPACITY = 15;  //默认堆栈大小
	private int top;  //定义栈顶指针
    public MyStackImpl() {
		elements = new Object[DEFAULT_CAPACITY];
	}
    public MyStackImpl(int init_CAPACITY) {
		elements = new Object[init_CAPACITY];
	}
	@Override
	public int getSize() {
		return top;
	}

	@Override
	public boolean isEmpty() {		
		return top<=0;
	}

	@Override
	public void push(Object e) {
		//压栈
		//判断栈是否满
		if(top>=elements.length){
			//栈已满,数组自动扩容
			//1、定义一个更大的数组,1.5倍扩容
			Object[] newElements = new Object[(int) (elements.length * 1.5)];
			//2、将元素一个个的放进大数组中
			for(int i=0;i<elements.length;i++){
				newElements[i] = elements[i];
			}
			//3、将数组名指向新数组
			elements = newElements;
		}
		//将元素放到站定指针指向的位置
		elements[top] = e;
		//站定指针上移
		top++;
	}

	@Override
	public Object pop() {
		// 弹栈
		//判断栈是否已空
		if(top <= 0){
			throw new StackOverflowError("栈已空");
		}
		//程序走到这里说明栈未空,栈顶指针top下移
		//System.out.println(top);
		top--;
		//System.out.println(top);
		return elements[top];
	}

	@Override
	public Object peek() {
		// 返回栈顶元素
		//判断站是否为空
		if(top <= 0){
			throw new StackOverflowError("栈已空");
		}
		return elements[top-1];
	}
	@Override
	public String toString() {
		// 重写toString
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		//遍历数组中的元素
		for(int i=top-1;i>=0;i--){
			sb.append(elements[i]);
			if(i>0){
				sb.append(",");  //","分割
			}
		}
		sb.append("]");
		return sb.toString();
	}
}

测试类

package qianyu.ArrayStack;
/**
 * 利用栈的特点实现进制转换
 * @author zhu
 *
 */
public class TestBaseConversion {

	public static void main(String[] args) {
	//为方便测试,没有编写接收用户输入的数据,直接写入数据进行调用
		System.out.println(baseConversion(100, 2));
		System.out.println(baseConversion(900, 8));
		System.out.println(baseConversion(2717, 16));
	}
	/**
	 * 把一个十进制的数num,转换为decimal指定的进制
	 * @param num  接收十进制的整数
	 * @param decimal   指定进制
	 * @return   返回num这个整数对应的decimal进制的字符串
	 */
	public static String baseConversion(int num,int decimal){
		MyStack stack = new MyStackImpl();
		while(num != 0){			
			//int remainder = num % decimal;
			char remainder = (char) (num % decimal);  //余数
			if(remainder >= 10){   //为十六进制准备
			 //10->A 11->B 12->C 13->D 14->E 15->F	
			 //'7'的ASCII码为55,'A'的ASCII码为65,相当于在10(remainder)基础上加'7'的ASCII码
				remainder += '7';  //ASCII码转换为字符
			}else{
			//'0'的ASCII码为48
				remainder += '0';
			}
			stack.push(remainder);
			num = num /decimal;
		}
		//出栈
		StringBuilder sb = new StringBuilder();
		while(!stack.isEmpty()){
			sb.append(stack.pop());
		}
		return sb.toString();		
	}
}

结果:
在这里插入图片描述


版权声明:本文为m0_51274044原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。