「栈」的应用系列之「进制转换」
大家都知道,计算机底层计算采用的是二进制,计算机的数据存储也是采用二进制,在网络上,设备与设备之间的通信,最终还是要通过二进制比特流来实现。可以说,二进制是信息时代的基础。那么大家有没有想过,既然计算机采用的是二进制,那为什么我们在电脑、手机上看到的信息是多种多样的呢?这就涉及到进制转换的问题了。比如当我们使用电脑上的计算器计算 98 + 56 时,计算机是先把十进制的 98 和 56 转换成二进制,然后再进行计算。
除了二进制,计算机中比较常用的还用八进制、十六进制等,比如内存地址的表示就是用的十六进制。今天我就带大家学习如何借助「栈」这个数据结构将十进制转换成计算机可以理解的二进制,乃至推广到将十进制转换成任意进制。
先来看一下十进制转二进制的计算过程。就以刚才说的 98 为例,用 2 除 98,取余数,然后再用 2 去除得到的商,取余数……如此循环往复,直到商为零,将余数逆序输出即可得到 98 的二进制表示。具体过程如下:
最后算出 98 的二进制是 1100010。
与二进制类似,如果要将十进制转换成八进制,也是按照除以 8 取余的方式。以98为例,具体过程如下:
最后得出 98 的八进制是142。推而广之,如果我们想把十进制转换成 N 进制(N 是大于等于 2 的自然数),就可以按照这种方式来进行计算。
由于我们要将计算过程中产生的余数逆序输出,也就是先产生的数要后输出,这恰恰符合栈的操作规则,所以当我们把该进制转换的算法实现为程序时,就可以用栈来存储计算过程中产生的余数序列。在写程序之前,先来复习一下栈都有哪些操作接口:
操作接口 | 功能 |
---|---|
size() | 报告栈的规模 |
empty() | 判断栈是否为空 |
push(e) | 将元素 e 插至栈顶(入栈) |
pop() | 删除栈顶对象,并返回该对象的引用(出栈) |
top() | 引用栈顶对象 |
利用栈的这些操作接口,可以写出代码如下:
#include "Stack.h"/*s:一个栈对象n:将要被转换的十进制数base:进制,若是二进制,则输入 2,若是八进制,则输入 8,以此类推*/
void convert(Stack<char> &s, __int64 n, int base) { //迭代版//0 < n, 1 < base <= 16,新进制下的数位符号,可视 base 取值范围适当扩充static char digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };while (n > 0) { //由低到高,逐一计算出新进制下的各数位s.push(digit[n % base]);//余数(当前位)入栈n /= base; //将 n 更新为其对 base 的除商}
}//新进制下由高到低的各数位,自顶而下保存在栈 s 中
本篇文章的代码以及代码中用到的头文件 Stack.h
均已上传至 GitHub,点击这里即可获得。
欢迎关注我的微信公众号,扫描下方二维码或微信搜索:AProgrammer,就可以找到我,我会持续为你分享 IT 技术。
「栈」的应用系列之「进制转换」相关推荐
- 进制转换数据结构c语言不用栈,急求!!!用数据结构(C语言)利用栈实现十进制向二(八)进制转换,要有注释,谢谢!...
匿名用户 1级 2013-12-05 回答 #include #include #include typedef unsigned int data_type; //结点数62616964757a68 ...
- 使用链栈来对十进制数进行任意进制的转换
使用辗转相除法,通过链栈来实现一个十进制数字对任意进制的一个转换,提前声明,这里不包括一进制和零进制的转换. #include"stdio.h" #include<stdli ...
- java:数据结构(二)栈的应用(进制转换全收集)
说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间 另一位仁兄介绍的封装好的方法: https://blog.csdn.net/m0_37961948/article ...
- 数据结构实验之栈与队列一:进制转换
Description 输入一个十进制非负整数,将其转换成对应的 R (2 <= R <= 9) 进制数,并输出. Input 第一行输入需要转换的十进制非负整数: 第二行输入 R. Ou ...
- C语言中用栈实现进制转换,利用栈实现进制转换问题
进制转换问题 建立顺序栈或链栈,编写程序实现十进制数到二进制数的转换. 输入 输入只有一行,就是十进制整数. 输出 转换后的二进制数. 样例输入 10 样例输出 1010 十进制怎么转为二进制?十进制 ...
- 请设计一个栈,实现十进制数转任意进制数。
文章目录 1.题目描述 2.代码实现 1.题目描述 请设计一个栈,实现十进制数转任意进制数 2.代码实现 #include <iostream> using namespace std;# ...
- 数据结构学习笔记:利用栈实现进制转换
数据结构学习笔记:利用栈实现进制转换 一.除基倒取余法示意图 二.编写十进制转换成二进制Python程序 1.源代码 2.运行结果 其实Python提供了一
- 栈的应用(进制转换)
class Stack:def __init__(self):self.items=[]def isEmpty(self):return self.items==[]def push(self,ite ...
- 数据结构实验三 用栈实现进制转换和计算器
在c++中栈已经有stl容器定义过了,在这里面我就不写栈的定义的那部分了(因为太麻烦了) 进制转换非常简单,尤其是这次只要求了十以内进制的转换,我们只需要先输入要转换的进制t,然后输入要转换的数n,每 ...
最新文章
- 解决ros安装 使用roscore命令测试问题
- 2008_10_28_星期二
- Redhat Linux 7.2 打开或关闭防火墙
- Redis集群环境搭建实践
- 逆袭进大厂:程序员究竟该如何学好前端?
- 分享超级表格用户在知乎上与我们的对话
- SVN汉化失败的原因及解决方案(通过SVN官网下载SVN和相应的汉化包)
- 使用51单片机驱动航模无刷电机
- Matlab实现常见的插值算法
- Cloudcompare2.12.2使用vs2022带插件编译以及在WSL中编译cloudCompare【最新实践】
- css动画钟表——transform之rotate
- dsp28335杂记1
- MAC系统下解决Teamviewer 被误认为商业用途的问题
- sqlserver 登录名与数据库用户
- Herb Sutter简介
- 爬虫之爬取英雄联盟战绩详细数据
- Oracle入门学习详解
- 360图书馆 解除网页防复制
- 代码规范 详细解释 husky、prettier、eslint、lint-staged 的作用和使用
- maven添加ojdbc6.jar(11g)包