十进制转二进制八进制十六进制(C语言栈(顺序栈和链栈))

目录

顺序栈

链栈 


 

顺序栈

#include<stdio.h>
#include<malloc.h>
#include<windows.h>
#define MAXSIZE 30
typedef int datatype;
typedef struct 
{
	datatype top;
	datatype data[MAXSIZE];
	
} SeqStack;
SeqStack *Init_SeqStack(){
	SeqStack *S;
	S=(SeqStack*)malloc(sizeof(SeqStack));
	S->top=-1;
}
int Push_SeqStack(SeqStack *S,int N){
	if(S->top==MAXSIZE-1){
		printf("栈满");
		return 1;
	}
	S->top++;
	S->data[S->top]=N;
	return 0;
}
int Empt_SeqStack(SeqStack *S){
	if(S->top==-1){
		return 1; 
	}else{
		return 0;
	}
}
 void Pop_SeqStack(SeqStack *S,datatype  *X){
	*X=S->data[S->top];
	S->top--;
}
void Comversion(int N,int r)
       { SeqStack *S;
         datatype x;
         S=Init_SeqStack();
         while(N)
          { 
	Push_SeqStack(S,N%r);   
	N=N/r;  
}
	while(!Empt_SeqStack(S))
    {
	Pop_SeqStack(S,&x);
        if(x>=10)
            printf("%c",x+55);
        else 
            printf("%d",x);
              }
        printf("\n");
          }
int main(){
	int N,r; 
	while(1){
		printf("请输入要转化的十进制数");
		scanf("%d",&N);
		printf("2:转换为二进制\n");
			printf("8:转换为八进制\n");
				printf("16:转换为十六进制\n");
				printf("0:清屏");
		scanf("%d",&r);
		switch(r){
			case 2:Comversion( N, r);break;
			case 8:Comversion( N, r);break;
			case 16:Comversion( N, r);break;
			case 0:system("cls");break;
			default : printf("请重新输入\n");break; 
		}
		
	}
	return 0;
}

链栈 

#include<stdio.h>
#include<malloc.h>
#include<windows.h>
typedef int datatype;
typedef struct  LinkNode{
	datatype data;
	struct LinkNode *next;
} StackNode, *LinkStack ;
 LinkStack Init_LinkStack(){
 	LinkStack S;
	S=(LinkStack)malloc(sizeof(StackNode));
	S->next=NULL;
 }
  LinkStack Push_LinkStack(LinkStack S,int N){
	 LinkStack p;
 	p=(LinkStack)malloc(sizeof(StackNode));
	p->data=N;
 	p->next=S->next;
 	S->next=p;
 	return S;
 }
LinkStack Pop_LinkStack(LinkStack S,datatype *x){
 	LinkStack p;
 	p=S->next;
 	*x=p->data;
 	S->next=p->next;
 	free(p);
 	return S;
 }
 bool Empt_LinkStack(LinkStack S){
 	if (S->next == NULL){
 		return true;
	 }else{
	 	return false;
	 }
 }
void ComversionLink(int N,int r)
       { LinkStack S;
         datatype x;
         S=Init_LinkStack();
         while(N)
          { 
S=Push_LinkStack(S,N%r);    
N=N/r;  
}
         while(!Empt_LinkStack(S))
           {  S=Pop_LinkStack(S,&x);
              if(x>=10)
                printf("%c",x+55);
              else 
                printf("%d",x);
              }
        printf("\n");
          }
int main(){
	int N,r; 
	while(1){
		printf("请输入要转化的十进制数");
		scanf("%d",&N);
		printf("2:转换为二进制\n");
			printf("8:转换为八进制\n");
				printf("16:转换为十六进制\n");
				printf("0:清屏");
		scanf("%d",&r);
		switch(r){
			case 2:ComversionLink( N, r);break;
			case 8:ComversionLink( N, r);break;
			case 16:ComversionLink( N, r);break;
			case 0:system("cls");break;
			default : printf("请重新输入\n");break; 
		}
		
	}
	return 0;
}

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,我可以为您解答关于使用C语言顺序栈实现进制转换二进制八进制十六进制的问题。 首先,您需要一些基本的知识。进制是我们平常使用的数字系统,有 0~9 一共 10 个数字。二进制是计算机使用的数字系统,只有 0 和 1 两个数字。八进制是由 0~7 八个数字组成的数字系统,十六进制是由 0~9 和 A~F 共 16 个数字组成的数字系统。 现在,我们开始讲解如何实现进制转换为其他进制: 1. 二进制转换 首先,我们可以使用除 2 取余法来实现进制转换二进制。具体步骤如下: 1) 初始化一个顺序栈,将进制数依次入; 2) 然后反转中的元素,依次出,并将该元素除以二的余数压入新的中; 3) 直到取完最后一个元素,将中所有元素出并输出即可。 下面是示例代码: void DecToBin(int dec) { int rem; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 2); dec /= 2; } while (!StackIsEmpty(S)) { Pop(&S, &rem); printf("%d", rem); } } 2. 八进制转换 我们可以使用除 8 取余法来实现进制转换八进制。具体步骤如下: 1) 初始化一个顺序栈,将进制数依次入; 2) 然后反转中的元素,依次出,并将该元素除以八的余数压入新的中; 3) 直到取完最后一个元素,将中所有元素出并输出即可。 示例代码如下: void DecToOct(int dec) { int rem; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 8); dec /= 8; } while (!StackIsEmpty(S)) { Pop(&S, &rem); printf("%d", rem); } } 3. 十六进制转换 我们可以将进制数转换二进制数,然后将二进制数每 4 位一组转换为对应的十六进制数字。具体步骤如下: 1) 先调用上面的十进制转二进制的函数 DecToBin(int dec) 来得到该进制数对应的二进制数; 2) 然后将得到的二进制数每 4 位一组,将每组的二进制转换为对应的十六进制数字; 3) 最后将多个十六进制数字拼接起来即可。 示例代码如下: void DecToHex(int dec) { int bin[100], hex[100], i = 0, j, n; char hex_char[16] = "0123456789ABCDEF"; SeqStack S; InitStack(&S); while (dec) { Push(&S, dec % 2); dec /= 2; } while (!StackIsEmpty(S)) { Pop(&S, &bin[i++]); } n = ceil((double)i / 4); for (j = 0; j < n * 4; ++j) { if (j < i) { hex[j / 4] <<= 1; hex[j / 4] |= bin[i - j - 1]; } else { hex[j / 4] <<= 1; } } for (j = n - 1; j >= 0; --j) { printf("%c", hex_char[hex[j]]); } } 希望可以帮到您,如有疑问请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值