用栈数据结构实现进制转换
栈结构:先进后出(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版权协议,转载请附上原文出处链接和本声明。