数据结构 中数制转换(栈的应用)

yizhihongxing

数据结构 中数制转换(栈的应用)

1. 什么是数制转换?

数制转换是从一种数字表示方式(即一种进位制,如二进制、八进制、十进制、十六进制等)转化为另一种数字表示方式的过程。在数制转换中,可以使用栈这种数据结构来进行转换的具体实现。

2. 根据位值权重的转换方法

2.1. 十进制转换为其他进制

2.1.1. 除余法

将十进制数不断除以目标进制的基数,比如2(表示二进制)或8(表示八进制)或16(表示十六进制),直到除数为0为止,在每次除法中,将余数记录下来,倒序排列起来即为转换后的数。
例如,将十进制的18转换成二进制:
- 先将18除以2得到商9余0;
- 将9除以2得到商4余1;
- 将4除以2得到商2余0;
- 将2除以2得到商1余0;
- 最后将1除以2得到商0余1。
将这些余数从下到上连接起来,就成了18的二进制数:10010。

2.1.2. 相减法

将十进制数按照多项式展开形式来表示,例如,18可以表示为1*10^1+8*10^0,而将十转换成16进制时,将上述式子中的10换成16即可,即:1*16^1+2*16^0。这样,就将十进制数转化为了其他进制,可以根据需要将数字或字母赋予对应的十进制值。

2.2. 其他进制转换为十进制

将其他进制各位的数字乘以对应权重(以该位所在的位权值为底的幂),然后将结果相加即可得到十进制数。
例如,将二进制数10010转换成十进制:
- 首先分解该数的位权值为权重1、2、4、8、16(从右往左数依次加倍),对应数字为0、1、0、0、1;
- 将各位数字乘以对应的权重,得到18(1*2^4+0*2^3+0*2^2+1*2^1+0*2^0)。
因此,二进制数10010表示的十进制数是18。

3. 有关进制的记数法

3.1. 二进制数的表示法

二进制数字左侧通常用0b或者B来表示,例如,0b101表示二进制数101;

3.2. 八进制数的表示法

八进制数字左侧通常用0或者O来表示,例如,011表示八进制数11;

3.3. 十六进制数的表示法

十六进制数字左侧通常用0x或者X来表示,例如,0xAC表示十六进制数AC。

4. 栈的应用

栈是一种特殊的数据结构,它只允许在栈顶进行操作,并具有"先进后出"的特点,因此非常适合用来实现进制转换。

4.1. 十进制转换为其他进制

以十进制转换为二进制为例,具体步骤如下:

  • 创建一个空栈,用来存放余数;
  • 将十进制数不断除以2,将得到的余数存入栈中,直到除数为0为止;
  • 将栈中存储的余数取出,并按照出栈的顺序拼接成一个数字即可。

下面的示例将十进制数18转换为二进制数:

def decimal_to_binary(decimal_num):
    """
    将十进制数转换为二进制数
    """
    s = []   # 创建一个空栈
    while True:
        decimal_num, remainder = divmod(decimal_num, 2)
        s.append(remainder)
        if decimal_num == 0:
            break
    # 将栈中剩余的元素一起弹出,按顺序拼接成字符串
    binary_num = ''
    while s:
        binary_num += str(s.pop())
    return binary_num

print(decimal_to_binary(18))   # 输出:10010

4.2. 其他进制转换为十进制

以二进制转换为十进制为例,具体步骤如下:

  • 创建一个空栈,用来存放各位数字;
  • 从右往左遍历二进制数的每一位数字,并将其存入栈中;
  • 将栈中的数字按位权值相加得到十进制数。

下面的示例将二进制数10010转换为十进制数:

def binary_to_decimal(binary_num):
    """
    将二进制数转换为十进制数
    """
    s = []   # 创建一个空栈
    for i in binary_num:
        s.append(int(i))
    # 将栈中的数字按位权值相加
    decimal_num = sum([s[i] * 2 ** i for i in range(len(s))])
    return decimal_num

print(binary_to_decimal('10010'))   # 输出:18

5. 总结

以上,介绍了在数据结构中利用栈实现数制转换的方法和步骤。无论是十进制转换为其他进制,还是其他进制转换为十进制,都可以用栈简单、快捷地实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构 中数制转换(栈的应用) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 「学习笔记」BSGS

    「学习笔记」BSGS 点击查看目录 目录 「学习笔记」BSGS Baby-step Giant-step 问题 算法 例题 Discrete Logging 代码 P3306 [SDOI2013] 随机数生成器 思路 P2485 [SDOI2011]计算器 思路 Matrix 思路 代码 Baby-step Giant-step 问题 在 \(O(\sqrt…

    算法与数据结构 2023年4月17日
    00
  • C语言深入浅出解析二叉树

    C语言深入浅出解析二叉树攻略 什么是二叉树 二叉树是一种树形数据结构,其每个节点最多只有两个子节点,分别称为其左子节点和右子节点。一般采用链式存储方式来实现二叉树,也可以使用数组来存储。 二叉树的遍历 二叉树的遍历分为三种方式:前序遍历,中序遍历和后序遍历。 前序遍历 前序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。可以使用递归或栈来实现。 v…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之队列

    带你了解Java数据结构和算法之队列 一、介绍 队列是已知的最古老和最常用的数据结构之一。它是一个线性结构,它遵循一个先进先出的原则,在日常生活中我们也很容易碰到队列。比如:在银行排队办理业务、队列中的电影厅、厨房中的菜单等等。 队列的操作主要有两种:入队(enqueue)和出队(dequeue)。插入操作只能在队尾进行,删除操作只能在队头进行。还有一些常用…

    数据结构 2023年5月17日
    00
  • C、C++线性表基本操作的详细介绍

    我来详细讲解“C、C++线性表基本操作的详细介绍”。 一、线性表的定义 线性表是一种数据结构,它是由n个数据元素组成的有限序列,记为(a1,a2,…,an),其中a1是线性表的第一个元素,an是线性表的最后一个元素。除第一个元素之外,每一个元素有且仅有一个直接前驱元素,除了最后一个元素之外,每一个元素有且仅有一个直接后继元素。 线性表可以理解为一个一维数…

    数据结构 2023年5月17日
    00
  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • 带你了解Java数据结构和算法之数组

    带你了解Java数据结构和算法之数组 在本教程中,我们将学习Java中的数组数据结构和对应的算法。让我们先来了解什么是数组。 什么是数组? 数组是一个同类型数据元素的集合,在内存中连续存储。数组具有索引性,我们可以使用索引值来访问数组中的元素。 声明和初始化数组 在Java中,声明一个数组需要指定以下三个参数: 数组的类型 数组的名称 数组的大小 以下是一个…

    数据结构 2023年5月17日
    00
  • c#解析jobject的数据结构

    下面我将从以下几个方面,详细讲解如何使用C#解析JObject的数据结构。 1. 什么是JObject JObject 是 JSON.NET 库中的一个类,用于处理Json格式数据。它表示一个 JSON 对象,可以通过键值对的形式来描述一个 JSON 对象,并在其中包含 JSON 数组。JObject对象是动态类型,允许在运行时动态添加、修改或删除对象的属性…

    数据结构 2023年5月17日
    00
  • 浅析Java 数据结构常用接口与类

    浅析 Java 数据结构常用接口与类 本文主要介绍 Java 中常用的数据结构接口和类,可以帮助读者了解和掌握常见的数据结构以及它们的实现方式,从而在日后的开发中使用它们,提高代码的效率和质量。 List 接口 List 接口是 Java 中常用的数据结构接口之一,它代表了一个有序的集合,集合中的每一个元素都可以通过其索引进行访问。List 接口的一些常用方…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部