进制转换算法概念

其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出。由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的。具体如上图。

栈的结构

#define ok 1
#define error 0
#define MAX_STACK_SIZE 10
#define SIZE 32
typedef int Status;
typedef char ElemType;typedef struct stack{ElemType *top;ElemType *base;int stackSize;
}Stack,*stackList; Status Pop(Stack *stack,ElemType *e){if(stack->top==stack->base)return error;stack->top--;*e=*(stack->top);*(stack->top)=0;return ok;
}Status Push(Stack *stack,ElemType e){if(stack->stackSize<=0){stack->top=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->top)return error;}stack->stackSize=MAX_STACK_SIZE; * stack->top=e;* stack->top++;stack->stackSize--;return ok;
} Status initStack(Stack *stack){stack->base=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->base)return error;int i;for(i=0;i<MAX_STACK_SIZE;i++)stack->base[i]=0;stack->top=stack->base;stack->stackSize=MAX_STACK_SIZE;return ok;}

上面的栈top,base是用指针的方式来实现的,具体的POP,PUSH代码,和初始化栈的initStack

转十进制

int toDecimal(Stack *stack){ElemType popData;//定义出栈数据缓冲区int sum=0;//总和int c=0; //位数while(Pop(stack,&popData)){int oper=popData-48;//栈中存放的是char类型数据,减去ascll码48是对应的数字sum+=oper*pow(2,c++);//相加}return sum;
}

转十六进制

//代码冗长,但思想不变。
//只不过多了一个4位判断,再转16进制的操作
ElemType * toHex(Stack *stack){ElemType popData;ElemType pop;Stack stack02;initStack(&stack02);int sum=0;int c=0;int count=0;ElemType tempData;ElemType *retData=(ElemType *)malloc(sizeof(ElemType)*SIZE); while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);count++; //一个16进制位由4个二进制为构成,count用来判断是否已经pop出一个16进制位if(count==4){//当超过9时要用字母表示if(sum>9){sum=sum%9;switch(sum){case 1:tempData='a';break;case 2:tempData='b';break;case 3:tempData='c';break;case 4:tempData='d';break;case 5:tempData='e';break;case 6:tempData='f';  break;   }}else{tempData=48+sum; //48是字符0的ascll码}Push(&stack02,tempData); //将得到的一个16进制数入栈count=0; //count重新计数sum=0;c=0;    }}//计算剩下的不满四个位的二进制数,再一次pushif(sum!=0){tempData=48+sum;Push(&stack02,tempData);} int index=0;//将栈2中的数据依次弹出,保存在retData数组中,作为字符输出while(Pop(&stack02,&pop)){retData[index]=pop;index++;}retData[index]='\n';return retData;}

工程代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ok 1
#define error 0
#define MAX_STACK_SIZE 10
#define SIZE 32
typedef int Status;
typedef char ElemType;typedef struct stack{ElemType *top;ElemType *base;int stackSize;
}Stack,*stackList; Status Pop(Stack *stack,ElemType *e){if(stack->top==stack->base)return error;stack->top--;*e=*(stack->top);*(stack->top)=0;return ok;
}Status Push(Stack *stack,ElemType e){if(stack->stackSize<=0){stack->top=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->top)return error;}stack->stackSize=MAX_STACK_SIZE; * stack->top=e;* stack->top++;stack->stackSize--;return ok;
} Status initStack(Stack *stack){stack->base=(ElemType *)malloc(sizeof(ElemType)*MAX_STACK_SIZE);if(!stack->base)return error;int i;for(i=0;i<MAX_STACK_SIZE;i++)stack->base[i]=0;stack->top=stack->base;stack->stackSize=MAX_STACK_SIZE;return ok;}ElemType * toHex(Stack *stack){ElemType popData;ElemType pop;Stack stack02;initStack(&stack02);int sum=0;int c=0;int count=0;ElemType tempData;ElemType *retData=(ElemType *)malloc(sizeof(ElemType)*SIZE); while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);count++; //一个16进制位由4个二进制为构成,count用来判断是否已经pop出一个16进制位if(count==4){//当超过9时要用字母表示if(sum>9){sum=sum%9;switch(sum){case 1:tempData='a';break;case 2:tempData='b';break;case 3:tempData='c';break;case 4:tempData='d';break;case 5:tempData='e';break;case 6:tempData='f';  break;   }}else{tempData=48+sum; //48是字符0的ascll码}Push(&stack02,tempData); //将得到的一个16进制数入栈count=0; //count重新计数sum=0;c=0;    }}//计算剩下的不满四个位的二进制数,再一次pushif(sum!=0){tempData=48+sum;Push(&stack02,tempData);} int index=0;//将栈2中的数据依次弹出,保存在retData数组中,作为字符输出while(Pop(&stack02,&pop)){retData[index]=pop;index++;}retData[index]='\n';return retData;}int toDecimal(Stack *stack){ElemType popData;int sum=0;int c=0;while(Pop(stack,&popData)){int oper=popData-48;sum+=oper*pow(2,c++);}return sum;
}void inputData(Stack *stack){char check;   initStack(stack);printf("输入一个二进制数(以#结束):"); scanf("%c",&check);while(check!='#'){Push(stack,check);scanf("%c",&check);     }getchar();}int main(int argc, char *argv[]) {int choice;printf("--------------------二进制转换工具----------------------\n\n");printf("作者:changlon\n");printf("时间: 2019-12/19\n\n");printf("--------------------------------------------------------\n");do{Stack stack;inputData(&stack);printf("请选择操作\n\n");printf("0.退出\n");printf("1.转十进制\n");printf("2.转十六进制\n\n");printf("选项:");int decimal;char *ret;scanf("%d",&choice);switch(choice){case 1:decimal=toDecimal(&stack);printf("%d\n\n",decimal);break;case 2:ret=toHex(&stack);printf("%s\n\n",ret);free(ret);break;    }}while(choice!=0);system("pause");return 0;
}

进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010相关推荐

  1. 按键精灵脚本转换成c语言,问一个关于按键码转换的问题

    MessageBox "鼠标指向窗口浏览区域后,按回车键" Hwnd = Plugin.Window.MousePoint() Call Plugin.Bkgnd.KeyPress ...

  2. 进制转化(c 语言实现)

    部分进制转化(c 语言实现) 文章目录 二进制转化为其他进制数 十进制数转化为二进制数   一.二进制转化为其他进制数 因为我们要将二进制数转化为其他进制数,所以第一步就是要确保输入的值为二进制数. ...

  3. c语言中如何将字符串转成16进制,用c语言写一个函数把十进制转换成十六进制,该如何处理...

    用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...

  4. 多种进制转化 C/C++语言

    多种进制转化 C/C++语言 二进制转十六进制法: C语言代码如下: #include<stdio.h> #include<string.h> int main(){int N ...

  5. 16进制转2进制的代码C语言

    16进制转2进制的代码C语言 #include <stdio.h> void main( void ) { unsigned int i, j, num, Num[20]; char St ...

  6. c语言的十进制转十六进制字符串,用c语言写一个函数把十进制转换成十六进制,该如何处理...

    用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...

  7. 用C语言实现一个简单的一元线性回归算法

    今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...

  8. 用C语言实现一个简单的计算器代码

    #include <stdio.h> #include <math.h> #include <stdlib.h> //预处理指令 int main(void) {d ...

  9. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

最新文章

  1. Wordpress 加入html等文件
  2. JAVA JVM原理详解
  3. java.util.concurrent介绍【转】
  4. hdu 4496 并查集 逆向 并查集删边
  5. 前端学习(982):jquery概述
  6. 2020年母婴消费洞察报告
  7. 产品经理如何应对一句话需求
  8. 云原生数据中台的 What、Why、Who、How和Where
  9. Lync Server 2010企业版系列PART7:部署前端
  10. 西威驱动板PV33-4 电源驱动板图纸 37千瓦左右基本一样 文件发送非实物
  11. 浪曦大型企业门户综合项目的设计、实施与管理实地培训班隆重开班招生中……
  12. python源文件的扩展名是什么_python源文件后缀是什么
  13. 合工大计算机系汪教授,合肥工业大学计算机与信息学院导师介绍:洪日昌
  14. 同时虚拟多个3D桌面
  15. Win10锁屏壁纸文件夹Assets无文件问题的解决方法
  16. UE:无法解析的外部符号 “public: __cdecl FKey::~FKey(void)“ (??1FKey@@QEAA@XZ)
  17. mysql最左前缀概念_mysql查询优化之目录类型、最左前缀
  18. 一文搞懂“网络协议”
  19. 《红色警戒2·尤里复仇》-第四章 随地建设
  20. 扑克牌顺子java_算法练习篇之:扑克牌顺子

热门文章

  1. 机动车辆保险反欺诈的大数据智能化研究
  2. 全球绿色建筑的 10 个最酷的例子
  3. 亚新联创 2011.9.17招聘会笔试题目
  4. ZLMediaKit在windows平台下的编译和运行
  5. NE40E/NE80E 端口镜像抓包
  6. 2022-2028全球及中国自助终端系统(SSTS)行业研究及十四五规划分析报告
  7. 互联网大会2017-防范通讯信息诈骗有感
  8. 【BDTC 2016】工业大数据助力中国制造 帮助企业降本增收
  9. [附源码]SSM计算机毕业设计高校流动党员信息管理系统JAVA
  10. Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质