进制的转换(栈的应用)
将十进制数N和其他d进制数之间进行转换是计算机实现计算的基本问题,解决方案很多,其中最简单的方法是除d取余法。例如,(1348)10=(2504)8,其转化过程如下所示:
N N div 8 N mod 8
1348 168 4
168 21 0
21 2 5
2 0 2
从中可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈的“后进先出”的特性。所以可以用顺序栈来模拟这个过程。
下面给出代码实现
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef struct
{ ElemType *base; //基指针 ElemType *top; //栈顶指针 int stacksize; //当前空间 }SqStack;int InitStack(SqStack &s) //栈的初始化 {s.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!s.base) return 0;s.top=s.base;s.stacksize=STACK_INIT_SIZE;return 1;}
int Push(SqStack &s,ElemType e) //栈的插入
{if(s.top-s.base>=s.stacksize){ s.base=(ElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(ElemType));if(!s.base) return 0;s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;return 1;
}
int Pop(SqStack &s,ElemType &e) //栈的删除
{if(s.top==s.base) return 0;e=*--s.top;
}
void tran_2(SqStack s,ElemType N) //8进制转换函数
{ ElemType e;while(N){Push(s,N%2);N=N/2;}printf("转换为2进制数为:"); while(s.base!=s.top){Pop(s,e);printf("%d",e);} }
void tran_8(SqStack s,ElemType N) //8进制转换函数
{ ElemType e;while(N){Push(s,N%8);N=N/8;}printf("转换为8进制数为:"); while(s.base!=s.top){Pop(s,e);printf("%d",e);} }
void tran_16(SqStack s,ElemType N) //16进制转换函数
{ ElemType e;while(N){ if(N%16<10)Push(s,N%16);else{ switch(N%16){ case 10:Push(s,65);break;case 11:Push(s,66);break;case 12:Push(s,67);break;case 13:Push(s,68);break;case 14:Push(s,69);break;case 15:Push(s,70);break; } }N=N/16;}printf("转换为16进制数为:"); while(s.base!=s.top){ if(*(s.top-1)>=0&&*(s.top-1)<10){ Pop(s,e);printf("%d",e);}else{ Pop(s,e);printf("%c",e);}} }
void menu() //打印菜单 { printf("---------------------------------------------2.转换为2进制----------------------------------------------------------"); printf("\n---------------------------------------------8.转换为8进制---------------------------------------------------------");printf("\n---------------------------------------------16.转换为16进制-------------------------------------------------------\n");}
int main()
{ SqStack s;int choose; ElemType N;InitStack(s);printf("输入十进制数:");scanf("%d",&N);printf("\n输入要转换的进制数:\n");menu();p:scanf("%d",&choose);switch(choose){ case 2:tran_2(s,N);break;case 8:tran_8(s,N);break;case 16:tran_16(s,N);break;default :printf("没有此进制,请重新输入");goto p;}return 0;
}

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
