1
算法与数据结构  C语言版
1.5.2.1 3.2.1 数制转换问题
3.2.1 数制转换问题

将十进制数N转换为r进制的数,其转换方法为辗转相除法:以N=3 456,r=8为例,转换方法如下:

所以:(3456)10 =(6563)8

我们看到所转换的八进制数是按从低位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位八进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。

算法思想如下:当N>0时重复(1)和(2)。

(1)若N≠0,则将N%r压入栈s中,执行(2);若N=0,将栈s的内容依次出栈,算法结束。

(2)用N/r代替N。

算法3.4 数制转换

算法3.4(a)是将对栈的操作抽象为模块调用,使问题的层次更加清楚。而算法3.4(b)是直接用int向量S和int变量top作为一个栈来使用。往往初学者将栈视为一个很复杂的东西,不知道如何使用,通过这个例子可以消除栈的“神秘”。当应用程序中需要与数据保存时相反顺序使用数据时,就要想到栈。通常用顺序栈较多,因为很便利。

在后面的例子中,为了在算法中表现出问题的层次,有关栈的操作调用了的相关函数,像算法3.4(a)那样,对余数的入栈操作:Push_SeqStack(&s,N%r);因为是用C语言描述,第一个参数是栈的地址才能对栈进行加工。在后面的例子中,为了算法的清楚易读,在不至于混淆的情况下,不再加地址运算符,请读者注意。