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

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

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日

相关文章

  • Go select使用与底层原理讲解

    标题:Go select使用与底层原理讲解 标准库提供的go语言引擎的选择器select语法是并发编程中常用的语法之一,它允许协程同时等待多个IO操作的完成,通常会和通道配合使用。在本文中,我们将详细讲解Go select的使用和底层原理。 Go select的使用 基本语法 在Go语言中,select语法的基本语法如下: select { case &lt…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:插入排序 Insertion Sort

    Java数据结构及算法实例:插入排序 Insertion Sort 算法简介 插入排序是一种简单的排序算法,它的工作方式是每次将一个待排序的元素与前面已经排好序的元素逐个比较,并插入到合适的位置。插入排序的时间复杂度为O(n^2),是一种比较低效的排序算法。 算法实现 以下是使用Java语言实现插入排序算法的代码: public static void in…

    数据结构 2023年5月17日
    00
  • C语言数据结构之复杂链表的拷贝

    C语言数据结构之复杂链表的拷贝 什么是复杂链表 在了解如何拷贝复杂链表之前,首先需要知道什么是复杂链表。复杂链表是由多个节点组成的链表,每个节点除了包含普通链表节点的值和指向下一个节点的指针外,还包含一个指向链表中的任意一个节点的指针。因此,每个节点有两个指针:一个指向下一个节点,一个指向任意一个节点。 复杂链表示意图如下: +—+ +—+ +—…

    数据结构 2023年5月17日
    00
  • Redis数据结构原理浅析

    Redis数据结构原理浅析 Redis是一种高性能键值型数据库,支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。本文将对Redis各种数据结构的原理进行浅析。 字符串 Redis中的字符串数据结构不仅可以存储普通的字符,还可以存储整数和浮点数。字符串的最大长度为512MB。字符串结构的底层实现是从一个内存块开始存储的,该内存块的大小为实际存储的…

    数据结构 2023年5月17日
    00
  • JS中的算法与数据结构之链表(Linked-list)实例详解

    JS中的算法与数据结构之链表(Linked-list)实例详解 什么是链表? 链表是计算机科学中的一种数据结构,由一系列结点(Link,也称为节点)组成,并通过每个节点中的指针(Pointer)链接在一起。每个节点包含数据和一个指向某个位置的引用。 链表的主要特点是在插入和删除操作中表现出很高的效率。与数组相比,链表的访问和操作速度较慢,但在处理动态结构数据…

    数据结构 2023年5月17日
    00
  • Halcon软件安装与界面简介

      1. 下载Halcon17版本到到本地 2. 双击安装包后 3. 步骤如下     界面分为四大块 1.    Halcon的五个助手 1)    图像采集助手:与相机连接,设定相机参数,采集图像 2)    标定助手:九点标定或是其它的标定,生成标定文件及内参外参,可以将像素单位转换为长度单位 3)    模板匹配助手:画取你想寻找的图像,设定参数,可…

    算法与数据结构 2023年4月19日
    00
  • C语言数据结构之栈和队列的实现及应用

    C语言数据结构之栈和队列的实现及应用 什么是栈和队列? 栈是一种具有后进先出(LIFO)特性的线性数据结构,可以理解为一个只能在一端进行插入和删除操作的数据结构。通常称插入元素的一端为栈顶,删除元素的一端为栈底。 队列是一种具有先进先出(FIFO)特性的线性数据结构,可以理解为一个只能在两端进行插入和删除操作的数据结构。一端进行插入操作,称之为队尾,一端进行…

    数据结构 2023年5月17日
    00
  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 什么是快速排序? 快速排序(Quicksort)是一种采用分治法(Divide and Conquer)的排序算法,通过将一个大问题逐步分解为小问题来解决的一种工具。 快速排序是一个比较快的排序算法,在平均状况下,排序n个项目要 O(n log n) 次比较,最坏情况下需要O(n^2)次比较,但这种状况并不常见。 快速排序算…

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