众所周知,栈是一种先进后出的数据结构。
利用这一点,我们可以设计数制转换的算法。假设我们有一个十进制数m,要把它转换成2进制数s,通常我们采用辗转相除法。
举个例子,比如:10
- 10/2=5 ······················ 余数 0
- 5/2=2 ························· 余数 1
- 2/2=1 ························· 余数 0
- 1/2=0 ························· 余数 1
好,那么到此为止,转换就完成了。将余数从下往上排列得到10的二进制数1010
那么这种计算方式是不是就刚好跟我们栈相似呢?倘若我们把每次得到的余数都放到栈里面,那么第一步得到的余数是不是就沉在栈底,是不是就是最后一个才能出来的?那么就刚好符合从下往上的辗转相除法。
下面是伪代码:
//m为转换前的数,n为转换后的数的进制
void conversion(int m,int n){
//构造栈
InitStack(S);
while(m){
//将余数压入栈中
Push(S,m%n);
//将得到的商设置为下一轮的被除数
m=m/n;
}
//栈非空
while(!StackEmpty(S)){
int e;
Pop(S,e);
printf("%d",e);
}
}