数据结构-栈的实现之数制转换

常用的进制有四种:二进制、八进制、十进制、十六进制。他们之间都可以进行俩俩的互相转换;

有一种转换方法为余数法,其转换思想与栈的存储正好适应。适用于十进制转换为二进制、八进制、十六进制;

余数法:连续除以基,直到商为0,从低到高纪录数值为转换结果。

因为结果是从低到高纪录的所以使用到栈,先将结果全部入栈之后再全部出栈。

实现函数代码(用到之前写的数据结构-栈的顺序表达结构的头文件):

 1void conversion(int a, int b)  //参数为从a进制转换为b进制
2 { 3 int num = 0; 4 char z = 'A'; 5 printf("请输入你想要转换的%d进制数",a); 6 scanf("%d", &num); 7 while(num) 8 { 9 Push(Scale, num%b);  //取余数逐个进栈 10 num /=b;  //求商 11 } 12 int e = 0; 13 printf("转换为%d进制数为:", b); 14 while(!StackEmpty(Scale)) 15 { 16 Pop(Scale, e);   //逐个出栈 17 if(e >= 10 && e <= 15)  //结果为十六进制时用到转换为字母 18 printf("%c", z+e-10); 19 else 20 printf("%d", e); 21 } 22 printf("\n"); 23 }

这样就用栈实现了由十进制转换为其他进制的算法。

接下来我们讨论下其他的进制转换为十进制的算法:实现方法可以用按权展开法,想了想。这种方法并没有什么好的算法解决。无非是两个循环嵌套,外循环一位位的走,内循环将每一位进行求幂。因为并没有涉及数据结构的思想(我认为这样写很麻烦)所以就只是讨论讨论实现方法,就不抛出代码了。等我想到更好的解决方法后在补上。

好了,现在与十进制有关的转换都实现了,还剩下三类:1、二进制与八进制;2、二进制与十六进制;3、八进制与十六进制;其实这三类都一样的实现。都先转换为十进制在用十进制余数法用栈去求。这样这三类就可以用上面介绍的与十进制有关的转换方法实现了;其实在解决其他进制转换为十进制上,如果只是输出的话完全可以用printf格式化输出实现。%o八进制输出,%x十六机制输出,%d十进制输出。当是格式化输出里没有对应的二进制输出,这点只能写函数实现。

 

posted @ 2016-04-12 21:08  A_book  阅读(12399)  评论(0编辑  收藏  举报