通过入栈和出栈实现二进制与十进制的相互转换

二进制转十进制的步骤:

100110 = 0×20 + 1×21 + 1×22 + 0×23 + 0×24 + 1×25 = 38

我们在键盘敲入100110时,就要把每一个数字进行入栈:

这样再将栈中的元素出栈,再进行数学运算即可。需要注意的是,二进制数字是以字符型传入,若以int型传入,则100110成为了一个整体,无法将每一位分开。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>typedef struct    //创建一个栈
{char * base;   //栈底    由于栈存放的是char型数据,指针类型也应为char*型char * top;      //栈顶int stacksize;  //栈的容量
}Sqstack2;void initstack(Sqstack2*s)    //栈的初始化函数
{s->base = (char*)malloc(20 * sizeof(char));    //开始时申请20块连续的内存单元if (!s->base)   //检测内存是否分配成功{exit(0);}s->top = s->base;  //开始是为空栈,栈顶和栈底的地址相同s->stacksize = 20;    //分配内存成功后更新栈的容量
}void push(Sqstack2*s,char x)   //入栈函数
{if (s->top - s->base >= s->stacksize) //先检测是否发生上溢{s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));   //若发生,则增加10个内存空间(动态扩容)if (!s->base) //检测内存是否分配成功{exit(0);}s->stacksize = s->stacksize + 10;s->top = s->base + 10;}*(s->top) = x;    //开始将数据存入栈中s->top++;   //存入一个数据,栈顶的地址相应增加(top位于最外侧数据的上一个单元)
}void pop(Sqstack2*s, char * x) //出栈函数
{if (s->top == s->base) //检测是否发生下溢{return;}s->top--;* x = *(s->top); //利用指针将数据传出
}int stacklen(Sqstack2*s)   //计算栈中元素个数函数
{return (s->top - s->base);   //这里并不是将地址相减,而是以char位单位计算元素个数
}int main()
{char c;    Sqstack2 * s = (Sqstack2*)malloc(sizeof(Sqstack2));    //申请一块Sqstack类型的内存的单元并用指针s存放此单元的地址int len, i, sum = 0;initstack(s);    //先将栈初始化printf("请输入二进制数:");c=getchar();   //输入数字while (c != '#')   //当输入#时表示输入完毕{push(s, c);   //将输入的数字入栈c=getchar(); //继续输入下一个数字}len = stacklen(s); //len表述栈中元素个数for (i = 0; i < len; i++){pop(s, &c);    //将元素出栈,函数用指针将数值赋值到c上sum = sum + (c - 48)*pow(2, i);   //查看ASCII码,用c-48将数字由char型转换为int型,并进行数学运算}printf("您所要的结果是:%d", sum);return 0;
}


二进制转十进制是通过取余的方法解决的:

38(10)=100110(2)

38/2=19余0,那么0则先入栈,19/2=9余1,1再入栈,9/2=4余1,1再入栈,4/2=2余0,0再入栈,2/2=1余0,0再入栈,1/2=0余1,1最后入栈。
那么栈底至栈顶依次是:100110

#include<stdio.h>
#include<stdlib.h>
#include<math.h>typedef struct
{int * base;int * top;int stacksize;
}Sqstack1;void transform(int m,int n)   //这里为了简便省去了许多检测条件和处理方法
{int r;//栈的初始化Sqstack1 * s = (Sqstack1*)malloc(sizeof(Sqstack1));s->base = (int*)malloc(10 * sizeof(int));s->top = s->base;s->stacksize = 10;//模拟相除取余while (m!=0){r = m % n;*(s->top) = r;    //余数入栈s->top++;    //栈顶++m = m / n;}int len = (s->top) - (s->base);  //得到栈的元素个数printf("您要的结果是:");for (int i = 0; i < len; i++){s->top--;   //先让top指向元素printf("%d", *(s->top));}
}int main()
{int m, n;printf("请输入一个十进制数:");scanf_s("%d", &m);//十进制数printf("请输入要转换的进制:");scanf_s("%d", &n);//要转换的进制transform(m, n);return 0;
}


兄弟萌仔细观察就能发现,第一个程序还可以完成其他进制到十进制的转换,第二个程序还可以完成十进制到其他进制的转换,其实两者结合就可完成某进制到某进制的转换(以十进制为跳板)。但常用的是二、八、十、十六进制。由此,二进制转八、十六进制的方法是什么呢?(除了以十进制为跳板)“三位一组”、“四位一组”,不知对宁是否有所启发呢?

栈应用之进制转换(C语言)相关推荐

  1. c语言oj答案进制转换,C语言编程的进制问题问题

    在我们的编译器,我用的是ADS   开发平台,现在RTC模块编程时,2410作为上位机,如下代码: n = rBCDDATE; if(n==1) time->day =0x31 ; 波斯历的日期 ...

  2. 栈的应用(进制转换)

    class Stack:def __init__(self):self.items=[]def isEmpty(self):return self.items==[]def push(self,ite ...

  3. 数据结构之栈 篇四——栈应用实现进制转换

    在前面博客的基础上,应用栈实现进制转换, 主要思想就是短除法,我们利用栈的先进后出的功能来实现逆向输出即可. 下面代码还需要篇三里面的文件,MyStack.h 1.应用一,简单篇 #include & ...

  4. 数据结构实验之栈一:进制转换

    题目描述 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数: 第二行输入R. 输出 输出转换所得的R进制数. 示例输入 1279 ...

  5. 栈的应用--进制转换

    问题描述:给一个整数,要求把它转换成相应的二进制. 题目解读:整数:1.考虑正负.2.如果整数是0 具体思路:可能学过编程的娃都知道,十进制转二进制就是不断的给它取余,再取余,然后倒着写出来就行了.那 ...

  6. 进制转换c语言代码_奇怪的C语言代码,有些函数在变量前加上(void)是什么类型转换?...

    C语言的语法极其简洁,即使是初次接触编程语言的初学者也能很快学完它的语法.不过,C语言也是一门"灵活得过了头"的编程语言,对于很多初学者来说,编写C语言程序就好像拿着一堆最基本的砖 ...

  7. 利用栈和递归实现进制转换——数据结构实验报告

    一.实验名称:栈的应用--进制转换 二.实验目的 熟练掌握栈的两种存储方式的具体实现过程,并分别使用递归和非递归两种方式,实现进制转换. 三.实验要求 顺序栈和链栈两种存储方式任选一种,实现从十进制到 ...

  8. 进制转换数据结构c语言不用栈,急求!!!用数据结构(C语言)利用栈实现十进制向二(八)进制转换,要有注释,谢谢!...

    匿名用户 1级 2013-12-05 回答 #include #include #include typedef unsigned int data_type; //结点数62616964757a68 ...

  9. C语言中用栈实现进制转换,利用栈实现进制转换问题

    进制转换问题 建立顺序栈或链栈,编写程序实现十进制数到二进制数的转换. 输入 输入只有一行,就是十进制整数. 输出 转换后的二进制数. 样例输入 10 样例输出 1010 十进制怎么转为二进制?十进制 ...

最新文章

  1. linux python版本_linux下更新Python版本并修改默认版本
  2. python创建csv文件并写入-【已解决】Python中创建和保存数据到csv文件中
  3. (转载)C#:Enum、Int和String的互相转换,枚举转换
  4. 使用popwindow制作弹出框与获得焦点弹出软键盘
  5. 遍历HashMap的四种方法
  6. pandas无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported
  7. ntrip获取源列表_Ntrip协议简介(转)
  8. 【BZOJ2744】【codevs2366】朋友圈,二分图最大匹配
  9. hive udaf_Hive UDAF 函数的编写
  10. 四级联动--省市县/区街道
  11. 小米手机系统wifi服务器,手机时间变慢,小米高管科普:3招即可解决
  12. 如何从零开始搭建SRE?
  13. 小米6刷MIUI12.5(miui12.5)超级详细教程
  14. Android 8.1 DisplayPowerController(四) 自动调节亮度(1)——流程
  15. 基于 Traefik 的 Basic Auth 配置
  16. 如何将qsv格式视频转换为MP4格式?qsv文件怎么转换成mp4
  17. 计算机数据库技术的应用现状,信息管理中计算机数据库技术的运用论文
  18. MOS管米勒效应的罪魁祸首--Cgd
  19. XMPP中文 XEP-0045: 多用户聊天(二)
  20. redis 发布订阅以及使用场景

热门文章

  1. android中build.gradle详细说明
  2. 使用GitHub.io当作自己的博客网站
  3. python 忽略返回值
  4. windows常用新建文件命令
  5. 华为服务器操作系统筹备开源社区,华为服务器操作系统开源,增强业务性能
  6. sonarQube(代码扫描工具)安装配置
  7. android浏览器对比评测,还在为选择哪个浏览器而纠结?Android手机浏览器横向对比评测!...
  8. http状态码301和302区别
  9. C++ 关闭窗口并杀掉进程
  10. linux删除用户及其相关文件