#前言
本篇文章依照数据结构中的栈来解决进制转换的问题,希望对读者有所帮助
进制转换原理
十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:N=(N div d) × d+N mod d(其中,div为整除运算,mod为求余运算)
例如:(1348)10=(2504)8,其运算过程如图:
算法原理
对于输入的任意一个非负十进制整数,输出与其等值的八进制数。上述计算过程是从低位到高位顺序产生八进制数的各个数位;而输出过程应从高位到低位进行,恰好和计算过程相反,因而我们可以使用栈来解决这个问题。在计算过程中依次将得到的余数压入栈中,计算完毕后,再依次弹出栈中的余数就是数制转换的结果。
因此这个算法我们可以根据数据结构中的栈这一结构来编写。
算法详解
算法编译环境
首先你要有一个含有栈的基本操作的头文件
https://blog.csdn.net/Liu1_1_/article/details/133855448
#include<stdio.h>
#include"Seqstack.h"
算法步骤
① 初始化一个空栈S。
② 当十进制数N非零时,循环执行以下操作:
·把N与8求余得到的八进制数压入栈S;
·N更新为N与8的商。
③ 当栈S非空时,循环执行以下操作:
·弹出栈顶元素e;
·输出e
算法实现
//十进制与R进制的转换
int conversion(int X, int r)
{
/*入口参数 十进制数字n 转换进制类型r 转换成功返回1 失败返回0*/
PSeqStack S; //定义栈
int x;
if (!r)
{
printf("基数不能为0");
return 0;
}
S = Init_SeqStack(); //初始化栈
if (!S)
{
printf("栈初始化错误!");
return 0;
}
while (X)
{
Push_SeqStack(S, X % r); //余数入栈
X = X / r;
}
while (!Empty_SeqStack(S)) //判断栈是否为空
{
Pop_SeqStack(S,&x); //出栈,并将元素保存到x中
printf("%d", x); //输出栈中的元素
}
Destroy_Seqstack(&S); //销毁栈
}
主函数
void main()
{
int r, num;
printf("输入要转换的十进制整数:");
scanf("%d", &num);
printf("要转换为的进制为:");
scanf("%d", &r);
printf("十进制整数%d转换为%d进制为:", num, r);
conversion(num,r); //进制转换
printf("\n\n\n");
}
运行结果
算法分析
显然,该算法的时间和空间复杂度均为O(log8n)。
这是利用栈的后进先出特性的最简单的例子。
在这个例子中,栈的操作是单调的,即先一味地入栈,然后一味地出栈。也许,有的读者会提出疑问:用数组直接实现不是更简单吗?但仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。而用数组不仅掩盖了问题的本质,还要分散精力去考虑数组下标增减等细节问题。
在实际利用栈的问题中,入栈和出栈操作大都不是单调的,而是交错进行的。相关问题如括号匹配,匹配舞伴等等,有兴趣请查看作者博客!
进制转换此篇文章只是整数之间的转换,小数之间的转换需要依靠数据结
构中队列这一结构,详细算法教程请关注博主的博客。