当前课程知识点:数据结构(上) > 第四章 栈与队列 > (c1)栈应用:进制转换 > 04C1-2 算法
那么这样一个转换的过程
在背后是如何实现的呢?
我们这里要使用到
所谓的短除法
比如 我们有可能需要
将十进制下的89
转换为二进制下的某一个表示
具体是多少呢?
我们来填空
我们需要将89写在这
然后画一条足够长的竖线
既然是二进制
所以我们首先要对89
做一次关于2的除法
我们将除的余数
也就是 此时的1记在这
再将整除所得的商
也就是44 记在这
好了 这就是典型的一步迭代
所谓的转换算法中
这是最重要的一步
以下无非是反复做这样的迭代
也就是说 我们要继续对这个商
做除2处理
而且每次将余数
比如说0 记在这
而将新的商记在这
以下余数、商
余数、商
余数、商
余数、商
以及最终的余数和0商
至此 我们只需由底而上
将所得到的这一串比特位记录下来
1 0 1 1 0 0 1
也就完成了这样一个转化的过程
再来看一个更一般的例子
我们来看如何将十进制下的2013
转化为五进制下的对应的表示
算法是一样的
首先将2013抄录于此
并且准备一条足够长的竖线
每次依然做除法 留余取商
我们这里看到 对于5的整除而言
其实最重要的是看最后一位
因此可知余数为3
而商呢 也不难得出是402
接下来 同样地 余数为2 商为80
余数为0 商为16
余数为1 商为3
最后一步 余数为3 商为0
至此 我们同样地自下而上
将所得到的各个数位
抄录于此 3 1 0 2 3
也就完成了这样的一个转化过程
这样的一个算法不难理解
甚至你可能会立即跃跃欲试
想要把它变成一个具体的程序
然而 我相信你很快
就会遇到一个棘手的难题
具体来讲 也就是
我们这里的计算过程
可以认为是自上而下
但是输出的过程却是自下而上
如果不借助对数的话
我们也很难在事先预测最终
会有多少个数位
也就是整个计算的深度
到底有多少
那这个问题应该如何解决呢?
我想你应该想到了栈
是的 我们只需引入一个栈
在计算的过程中
我们每得到一个数位
就随即通过push将它压入栈中
也就是说 这些数位进栈的次序
恰好就是它们被计算出来的次序
在这个图中 是自上而下
我们还应该记得栈的特性
也就是后进先出
last in first out
所以 一旦计算终止
我们就可以通过一系列pop操作
将这些数位按刚才的逆序
重新输出出来
从而得到我们所需要的结果
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验