栈实现十进制转换为二进制,八进制和十六进制
程序员文章站
2022-07-15 10:55:22
...
c语言栈实现十进制转换为二进制,八进制和十六进制
写一个程序,将输入的十进制数据M 转换为八进制数据M8,将其调试通过.在此基础上修改程序,实现十进制数据M 向N 进制(2或8或16)的转换.
#include<stdio.h>
#include<stdlib.h>
#define INIT_SIZE 100
#define N 80
typedef struct stack{
int *top,*base;
int size;
}stack;
/********初始化构建一个空栈*********/
void initStack(stack &s){
s.base=(int*)malloc(sizeof(int)*INIT_SIZE);//分配储存空间
if(!s.base)//如果分配失败则退出
exit(0);
s.size=INIT_SIZE;
s.top=s.base;//注意,若写成s.base=s.top,则会导致栈初始化失败
}
//push函数将元素压入栈
void push(stack &s,int m){
int *p=NULL;
if(!s.base)
exit(0);
if(s.size<=s.top-s.base){//若储存空间不够 ,则重新申请
p=(int*)realloc(s.base,sizeof(int)*(INIT_SIZE+N));
if(!p){
printf("内存再次分配失败!");
exit(0);
}
s.base=p;
s.top=s.base+N;
s.size+=N;
}
*s.top=m; //将新元素压进栈顶;
s.top++; //栈顶指针向上移动1个单位
}
/********出栈函数*********/
int pop(stack &s){
int m;
s.top--;//栈顶指针指向最上面的元素
m=*s.top;//将栈顶元素赋给m
return m;
}
/********计算相应的进制并输出*********/
void calcu(stack &s,int n,int r){
int temp,m;
while(n){
temp=n%r;
n/=r;
push(s,temp);
}
while(s.top!=s.base){//若栈中还有元素,则进入循环,执行输出操作
m=pop(s);
if(r==16){//若为16进制
if(m==10)
printf("A");
else if(m==11)
printf("B");
else if(m==12)
printf("C");
else if(m==13)
printf("D");
else if(m==14)
printf("E");
else if(m==15)
printf("F");
else printf("%d",m);
}
else
printf("%d",m);//2进制和8进制
}
}
int main(){
int i,n;
stack s;
initStack(s);
printf("请输入一个十进制的数字:");
scanf("%d",&n);
if(n<0){
printf("输入的数字有误!");
exit(0);
}
printf("对应的二进制的是:");
calcu(s,n,2);
printf("\n对应的八进制的是:");
calcu(s,n,8);
printf("\n对应的十六进制的是:");
calcu(s,n,16);
return 0;
}
注意:此代码具有局限性,十位以内的运算正确,超出十位则会发生错误
上一篇: Python:将十进制数转换为二进制,八进制,十六进制数
下一篇: C语言实现十进制转换为二进制