一.需求
利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法(R为二至九之间)。
二.分析
由计算机基础知识可知,把一个十进制整数x转换为任一种r进制数得到的是一个r进制的整数,假定为y,转换方法是逐次除基数r取余法。具体做法是:首先用十进制整数x除以基数r,得到的整余数是r进制数y的最低位y0,接着以x除以r的整数商作为被除数,用它除以r得到的整余数是y的次最低位y1,依次类推,直到商为0时得到的整余数是y的最高位ym,假定y共有m+1位。这样得到的y与x等值,y的按权展开式为:
y=y0+y1.r+y2.r2+…+ym.rm
假定一个十进制整数为3425,则把它转换为八进制数的过程如图5-3所示。
图 十进制整数3425转换为八进制数6541的过程
最后得到的八进制数为(6541)8,对应的十进制数为6×83+5×82+4×8+1=3425,即为被转换的十进制数,证明转换过程是正确的。
从十进制整数转换为r进制数的过程中,由低到高依次得到r进制数中的每一位数字,而输出时又需要由高到低依次输出每一位。所以此问题适合利用栈来解决
三.用到的知识
初始化栈、判栈为空、出栈、入栈、释放结点等运算。
四.程序伪代码
改善以上程序,使程序能够无限次进行数制转换直到用户要求退出,例如:“进行进制转换请按1,退出请按0”当用户输入0时,程序才退出。
五.代码实现
部分代码:
//链栈结点结构
typedef struct LSNode{
ElemType data;//数据域
struct LSNode *next; //指针域
}LSNode,*LStack;
//初始化
Status InitLSN(LStack &L){
if(NULL==(L=(LStack)malloc(sizeof(LSNode))))
return OVERFLOW;
L->next=NULL;//头结点的next域为空
return OK; }
//判断栈是否为空
Status notnull(LStack L){
//判断栈是不是空
if(L==NULL)
return OK; //如果空,返回OK,即为1
else
return ERROR;
}
//入栈
Status POP_LSN(LStack &L,ElemType e){
LStack t;
t = (LStack)malloc(sizeof(LSNode)); //开辟存储空间
if(NULL == t) return OVERFLOW;//失败
t->data = e;
t->next = L;//指向原栈头
L = t;
return OK;
}
//出栈
Status PUSH_LSN(LStack &L,ElemType e){
LStack t;
if(NULL == L) return OVERFLOW; //空栈
t = L; //指向栈顶元素结点
e = L->data; //用e返回栈顶元素值
printf("%d",e);
L = L->next; //删除栈顶元素结点
free(t); //释放结点
return OK;
}
六.运行结果
求3425的8进制
完成进栈后的示意图
出栈(栈头结点6出栈)
输出的结果为6541
注:完成代码关注公众号回复100902得到。