欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

栈实现十进制转换为二进制,八进制和十六进制

程序员文章站 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;	
}

注意:此代码具有局限性,十位以内的运算正确,超出十位则会发生错误
栈实现十进制转换为二进制,八进制和十六进制栈实现十进制转换为二进制,八进制和十六进制