数据结构的一些总结---利用Python实现

news2024/11/28 22:39:07

大家好,我是北山啦,本文简单介绍Python数据结构的相关内容,简单就是很简单的那种

文章目录

  • 查找
    • 线性查找 O(n)
    • 二分查找(Binary Search) O(logn)
  • 排序
    • 排序Low B三人组
      • 冒泡排序
      • 选择排序
      • 插入排序
    • 排序NB三人组
      • 快速排序
      • 归并排序
  • 数据结构
    • 栈和队列
      • 队列
      • 应用
    • 链表
    • 贪心算法
      • 例如:找零问题:钱数量最少
      • 例子:背包问题:价值最多
      • 例子:数字拼接问题:整数最大
      • 活动选择问题:活动个数最多
    • 动态规划
      • 钢条切割问题

查找

线性查找 O(n)

def linear_search(li,val):
    for ind,v in enumerate(li):
        if v == val:
            return ind
        else:
            return None

二分查找(Binary Search) O(logn)

二分查找:又叫这半查找,从有序列表的初始候选去li[0:n]开始,通过对待查找的值与候选去中间值的比较,可以使候选区减少一半

在这里插入图片描述
在这里插入图片描述

def binary_search(li,val):
    left = 0
    right = len(li) - 1
    while left <= right:  #候选区还有值
        mid = (left + right) // 2
        if li[mid] > val:
            right = mid - 1
        elif li[mid] < val:
            left = mid +1
        else:
            return mid
    else:
        return None
#binary_search([1,23,2,5,4],1)
binary_search([1,23,2,5,4],1)
0

排序

  • 排序就是将一组’无序’的记录顺序调整为有序的记录顺序,升序与降序,内置排序函数sort()
    在这里插入图片描述

排序Low B三人组

  • 冒泡排序
  • 选择排序
  • 插入排序

冒泡排序

列表每两个相邻的数,如果前面比后面的大,则交换这两个数

一趟排序完成之后,则无序区减少一个属,有序区增加一个数

关键词:躺、有序区、无序区范围

时间复杂度为O(n^2)

def bubble_sort(li):
    for i in range(len(li) - 1):
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j],li[j+1] = li[j+1],li[j]
import random
li = [random.randint(0,100) for i in range(100)]
print(li)
bubble_sort(li)
print(li)
[25, 55, 20, 14, 85, 57, 87, 21, 81, 15, 49, 97, 15, 64, 57, 6, 55, 12, 18, 79, 26, 84, 38, 45, 39, 74, 19, 2, 6, 60, 39, 27, 61, 53, 35, 73, 83, 84, 46, 62, 54, 83, 5, 76, 11, 13, 8, 73, 58, 79, 66, 96, 96, 39, 11, 56, 48, 84, 45, 94, 17, 41, 82, 34, 42, 45, 90, 70, 64, 32, 38, 7, 60, 76, 9, 38, 47, 75, 0, 48, 31, 47, 85, 23, 42, 57, 37, 29, 59, 56, 10, 25, 54, 90, 84, 32, 49, 61, 50, 63]
[0, 2, 5, 6, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 17, 18, 19, 20, 21, 23, 25, 25, 26, 27, 29, 31, 32, 32, 34, 35, 37, 38, 38, 38, 39, 39, 39, 41, 42, 42, 45, 45, 45, 46, 47, 47, 48, 48, 49, 49, 50, 53, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 59, 60, 60, 61, 61, 62, 63, 64, 64, 66, 70, 73, 73, 74, 75, 76, 76, 79, 79, 81, 82, 83, 83, 84, 84, 84, 84, 85, 85, 87, 90, 90, 94, 96, 96, 97]

冒泡排序改进

# l2 = [9,8,7,1,2,3,4,5,6]
# print(l2)
# bubble_sort(l2)
def bubble_sort(li):
    for i in range(len(li) - 1):
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j],li[j+1] = li[j+1],li[j]
                exchange = True
        if not exchange:
            return 

li = [1,2,3,4,5] #改进后只需要一趟,而改进前需要n-1趟

选择排序

每次选择最小or最大的加入新的列表当中

def select_sort_simple(li):
    li_new = []
    for i in range(len(li)):
        min_val = min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new
select_sort_simple([3,4,5,61,3,3])
[3, 3, 3, 4, 5, 61]

改进

def select_sort(li):
    for i in range(len(li) - 1):#i是第几趟
        min_loc = i
        for j in range(i+1,len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i],li[min_loc] = li[min_loc],li[i]
    return li
select_sort([3,4,5,61,3,3])
[3, 3, 3, 4, 5, 61]

插入排序

插入排序是一种简单直观的排序算法,其基本思想是将未排序的元素插入到已排序的序列中,从而得到一个新的排序序列。

插入排序的实现步骤如下:

将第一个元素看作已排序序列,从第二个元素开始遍历未排序序列;

每次遍历到一个新元素时,将它插入到已排序序列中的合适位置;

重复步骤2,直到遍历完所有未排序元素。

def insert_sort(li):
    for i in range(1,len(li)):
        j = i-1
        temp = li[i]
        while j >= 0 and li[j] > temp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = temp
    return li

排序NB三人组

  • 快速排序
  • 堆排序
  • 归并排序

快速排序

快速排序是从冒泡排序演变而来的算法,但是比冒泡排序要高效得多,所以叫做快速排序。快速排序之所以快速,是因为它使用了 “分治法”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WE7G9k05-1687183591926)(attachment:image.png)]
具体思想:

def quick_sort(data,left,right):
    if left < right:
        mid = partiton(data,left,right)
        quick_sort(data,left,mid-1)
        quick_sort(data,mid+1,right)

代码实现:

def quick_sort(li):
    if len(li) <= 1:return li
    left,right = [],[]
    mid = li[0]
    for i in range(1,len(li)):
        if mid > li[i]:
            left.append(li[i])
        else:
            right.append(li[i])
    return quick_sort(left) + [mid] + quick_sort(right)
print(quick_sort([1,23,1,2,14,3,2]))
[1, 1, 2, 2, 3, 14, 23]

归并排序

归并排序是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用

分治法:

分割:递归地把当前序列平均分割成两半
集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)

在这里插入图片描述
在这里插入图片描述

from heapq import merge
def merge_sort(li):
    if len(li) <= 1:return li # 从递归中返回长度为1的序列
    middle = len(li) // 2
    left = merge_sort(li[:middle])
    right = merge_sort(li[middle:])# 通过不断递归,将原始序列拆分成n个小序列
    return list(merge(left,right))
merge_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

自己写的merge函数

def merge(left, right):
    result = []
    while len(left) > 0 and len(right) > 0:
     # 左右两个数列第一个最小放前面
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
     # 只有一个数列中还有值,直接添加
    result += left
    result += right
    return result
merge_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

数据结构

数据结构是指相互之间存在着一种或者多种关系的数据元素的集合和该集合中数据元素之间的关系组成,简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中

比如:列表、集合与字典等都是一种数据结构

在这里插入图片描述

栈和队列

在这里插入图片描述

在Python中,一般使用列表结构即可实现栈

进栈:li.append()

出栈:li.pop()

取栈顶:li[-1]

队列

在这里插入图片描述

在这里插入图片描述

Python队列内置模块,使用方法:from collections import deque

  • 创建队列:queue = deque()

  • 进队:append()

  • 出队:popleft()

  • 双向队列队首进队:appendleft()

  • 双向队列队尾出队:pop()

应用

栈的应用:括号匹配问题

括号匹配:给一个字符串,其中包括小括号、中括号、大括号,求该字符串中的括号是否匹配

参考代码:

https://blog.csdn.net/qq3342560494/article/details/128521756

https://cloud.tencent.com/developer/article/2040208

#定义要检查匹配的符号类型
brackets = {'}': '{', ']': '[', ')': '(', '>': '<'}
#将符号的正反向进行分类
bracket_l, brackets_r = brackets.values(), brackets.keys()

#定义一个检查字符串的方法
def check(str1):
    alist = [] #定义一个空列表
    for c in str1:
        if c in bracket_l:
            alist.append(c)#将左符号压入栈内
        elif c in brackets_r:#右符号要么出栈,要么匹配失败,不做处理
            if alist and alist[-1] == brackets[c]:#判断alist不会空且alist最后一个字符等于左符号对应的右符号时
                alist.pop() #就做出栈操作
            else:
                return False
    return True #传入空的字符串直接返回true

if __name__ == '__main__':
    print(check("6c[*]{7b +[(8e -s3) * (d4+t5)]}<<>>"))
    print(check("6c*{7b+ [8e- 9f]}<>"))
    print(check(""))
True
True
True

栈和队列的应用–迷宫问题
在这里插入图片描述

栈–深度优先搜索-回溯法

在这里插入图片描述

maze = [
    [1,1,1,1,1],
    [1,0,1,0,1],
    [1,0,0,1,1],
    [1,1,0,0,1],
    [1,0,1,0,1]   
]
#表示四个方向
dirs = [
    lambda x,y:(x+1,y),
    lambda x,y:(x-1,y),
    lambda x,y:(x,y+1),
    lambda x,y:(x,y-1)
]
def maze_path(x1,y1,x2,y2):
    stack = []
    stack.append((x1,y1))
    while len(stack) > 0:
        curNode = stack[-1] #出发位置
        """找到了终点,打印路线"""
        if curNode[0] == x2 and curNode[1] == y2:
            for p in stack:
                print(p)
            return True
        
        for dir in dirs:
            nextNode = dir(curNode[0],curNode[1])#走四个方向:x-1,y;x+1,y;x,y-1;x,y+1
            #如果下一个节点能走
            if maze[nextNode[0]][nextNode[1]] == 0:#0表示能走
                stack.append(nextNode)#存入栈中
                maze[nextNode[0]][nextNode[1]] = 2  #标记走过了的路
                break
        else:
            maze[nextNode[0]][nextNode[1]] = 2
            stack.pop()
    else:
        print('没有路')
        return False
maze_path(1,1,3,3)            
(1, 1)
(2, 1)
(2, 2)
(3, 2)
(3, 3)





True

链表

在这里插入图片描述

class Node:
    def __init__(self,item):
        self.item = item
        self.next = None
a = Node(1)
b = Node(2)
c = Node(3)
a.next = b
b.next = c
print(a.next.next.item)

当然,链表的相关问题还很多,大家自行学习吧

贪心算法

在这里插入图片描述

例如:找零问题:钱数量最少

假设商家老板需要找零n元钱,钱币的面额又有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?

t = [100,50,20,5,1]
def change(t,n):
    m = [0 for _ in range(len(t))]
    for i,money in enumerate(t):
        m[i] = n // money
        n = n % money
    return m,n  #m:对应t中的个数,n:表示剩余
change(t,35)
([0, 0, 1, 3, 0], 0)

例子:背包问题:价值最多

一个小偷在某个商店发现有n个商品,第i个商品价值vi元,重wi千克。他希望拿走的价值尽量高,但他的背包最多只能容纳w千克的东西,他应该拿走那些商品

  • 0-1背包:对于一个商品,小偷要么把它完整拿走,要么留下,不能之拿走一部分,或把一个商品拿走多次。(金条)
  • 分数背包:对于一个商品,小偷可以拿走其中任意一部分。(金沙)

在这里插入图片描述

对于分数背包问题,贪心算法是最优的

对于0-1背包问题,就不是了

goods = [(60,10),(100,20),(120,30)]#每个商品元组表示:(价格,重量)
goods.sort(key = lambda x:x[0]/x[1],reverse=True)
goods = [(60,10),(100,20),(120,30)]
goods.sort(key=lambda x:x[0]/x[1],reverse=True)
def fractional_backpack(goods,w):
    m = [0 for _ in range(len(goods))]
    total_value = 0
    for i,(prize,weight) in enumerate(goods):
        if w >= weight:
            m[i] = 1
            w -= weight
            total_value += m[i]*prize
        else:
            m[i] = w / weight
            total_value += m[i]*prize
            w = 0 
            break
    return total_value,m
print(fractional_backpack(goods,50))
(240.0, [1, 1, 0.6666666666666666])

对于0-1背包问题,贪心做不了,要用到动态规划

例子:数字拼接问题:整数最大

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0eRSwSn-1687183591968)(attachment:image.png)]

a + b if a+b> b+a else b+a

from functools import cmp_to_key
li = [32,94,128,6,71]
def xy_cmp(x,y):
    if x+y < y+x:
        return 1
    elif x +y > y +x:
        return -1
    else:
        return 0
def number_join(li):
    li = list(map(str,li))
    li.sort(key = cmp_to_key(xy_cmp))
    return ''.join(li)
print(number_join(li))
    
9471632128
def largest_number(nums):
    nums = [str(num) for num in nums]
    nums.sort(key=lambda x: x*10, reverse=True)
    return ''.join(nums)

活动选择问题:活动个数最多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jLGL2nx-1687183591970)(attachment:image.png)]

利用反证法来证明:最先结束的活动一定是最优解的一部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-erUcBwBR-1687183591971)(attachment:image-2.png)]

activities = [(1,4),(3,5),(0,6),(5,7),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16)]
activities.sort(key=lambda x:x[1])
def activities_selection(a):
    res = [a[0]]
    for i in range(1,len(a)):
        if a[i][0] >= res[-1][1]:
            res.append(a[i])
    return res
print(activities_selection(activities))
[(1, 4), (5, 7), (8, 11), (12, 16)]

动态规划

利用递归来解决斐波拉契问题

def fibnacci(n):
    if n== 1 or n==2:
        return 1
    return fibnacci(n-1) + fibnacci(n-2)

动态规划(DP)的思想 = 递推式 + 重复子问题

#动态规划的思想
def fibnacci_no_recurision(n):
    f = [0,1,1]
    if n >2:
        for i in range(n-2):
            num = f[-1] + f[-2]
            f.append(num)
    return f[n]
print(fibnacci_no_recurision(40))
102334155

钢条切割问题

某公司出售钢条,出售价格与钢条长度之间的关系如下:
在这里插入图片描述

问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总利益最大
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#p = [0,1,5,8,9,10,17,17,20,21,23,24,26,27,27,28,30,33,36,39,40]
p = [0,1,5,8,9,10,17,17,20,24,30]

递归的方法来解决

def cut_rod_recurision_1(p,n):
    if n == 0:
        return 0
    else:
        res = p[n]
        for i in range(1,n):
            res = max(res,cut_rod_recurision(p,i) + cut_rod_recurision(p,n-i))
        return res
cut_rod_recurision_1(p,9)
25
def cut_rod_recurision_2(p,n):
    if n == 0:
        return 0
    else:
        res = 0
        for i in range(1,n+1):
            res = max(res,p[i] + cut_rod_recurision_2(p,n-i))
        return res
cut_rod_recurision_2(p,9)   
25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Day 3 of 17]Building a document scanner in OpenCV

a computer vision-powered document scanner 计算机视觉驱动的文档扫描仪&#xff0c;三个步骤&#xff1a; 边缘检测edges通过边缘&#xff0c;找到代表待扫描纸张的轮廓contour应用透视转换(a perspective transform)获得文档自上而下的视图 How to Build a Kick-Ass Mob…

录音转文字的方法有哪些?这三个录音转文字的方法有哪些

你是否曾经遇到过这样的场景&#xff1a;在开会或者采访时&#xff0c;需要记录重要信息&#xff0c;但是手写记录或打字速度跟不上对话节奏&#xff0c;甚至难以记录所有细节。此时&#xff0c;录音转文字软件就派上用场了。然而&#xff0c;市场上有太多种选择&#xff0c;到…

【Vue3 生态】Vue Router 路由知识概览

前言 在 Web 前端开发中&#xff0c;路由是非常重要的一环&#xff0c;但是路由到底是什么呢&#xff1f; 从路由的用途上讲 路由是指随着浏览器地址栏的变化&#xff0c;展示给用户不同的页面。 从路由的实现原理上讲 路由是URL到函数的映射。它将 URL 和应用程序的不同部分…

低代码平台——提高研发效率的神器

一、前言 听起来像是一个噱头&#xff0c;但是低代码确实是一个能够快速提高研发效率的神器。 通过使用低代码平台&#xff0c;研发人员可以节省好几个月的时间&#xff0c;将前后端各种功能可视化以搭积木的形式快速完成。今天&#xff0c;我们将深入探讨低代码开发平台的特点…

两阶段目标检测指南:R-CNN、FPN、Mask R-CNN

动动发财的小手&#xff0c;点个赞吧&#xff01; Source[1] 多阶段&#xff08;Two-stage&#xff09;物体检测 计算机视觉中最基本和最广泛研究的挑战之一是目标检测。该任务旨在在给定图像中绘制多个对象边界框&#xff0c;这在包括自动驾驶在内的许多领域非常重要。通常&am…

一种看门狗复位电源的电路

如下是一个看门狗复位电源的电路&#xff1a; 满足掉电能被监测到&#xff0c;掉电后利用法拉电容保持后级模组继续工作一段时间。 看门狗可以关闭电源 320ms 20ms &#xff0c;对后级模组起到断电复位作用。 同时复位电源拉低的是VCC_4V 而非超级电容所在的VCC_4V_IN,并不会…

SpringBoot项目的事务实现

说明&#xff1a;当业务中的某个功能&#xff0c;需要多个操作组合执行才能完成时&#xff08;如删除部门&#xff0c;部门下的员工也需要同步删除时&#xff09;&#xff0c;为了保证数据的一致性&#xff0c;需要对这些组合操作添加事务。&#xff08;参考&#xff1a;http:/…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法&#xff0c;通过记录读卡器或智能手机打开时的电源 LED&#xff0c;使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知&#xff0c;这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

一、elasticsearch的简介与安装

目录 一、Elasticsearch下载 二、安装 三、启动 四、安装可视化插件&#xff08;elasticsearch-head&#xff09; 1、下载地址 2、解压缩下载好的压缩文件 3、进入解压缩目录 五、解决跨域问题 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方…

端午节出行的小贴士——行之安,乐之逍

亲爱的朋友们&#xff0c; 随着端午节的到来&#xff0c;想必许多人已经开始期待那份出游的快乐与解脱。无论你是期待漫步在宁静的田野小径&#xff0c;还是在繁华的城市中探索&#xff0c;这篇文章都会给你一些实用的端午节出行建议&#xff0c;帮助你尽情享受旅程。 首先&a…

Airtest图像识别测试工具原理解读最佳实践 | 京东云技术团队

1 Airtest简介 Airtest是一个跨平台的、基于图像识别的UI自动化测试框架&#xff0c;适用于游戏和App&#xff0c;支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli&#xff0c;引用该框架后&#xff0c;不再需要一行行的写代码&#xff0c;通过截取按…

如何利用数据化营销助力新零售企业发展?”

​“新零售”这个概念诞生至今已有5年&#xff0c;但对于其具体的定义&#xff0c;行业内仍然有许多争议。有人认为“新零售”是对传统零售模式的颠覆&#xff1b;也有人认为“新零售”就是将线上和线下相结合。不论如何&#xff0c;在这个不断变化的行业中&#xff0c;新零售企…

使用omp技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

智能数字资产管理系统,全面提升企业的管理效率

智能数字资产管理系统&#xff0c;能够为企业带来很多成果&#xff0c;提高企业管理效率。让程序简单化&#xff0c;提升组织生产率&#xff0c;可以帮助企业以更有效的方式企业实现目标。 研发背景 智能数字资产管理系统 系统功能 1.可以实现数字资产全生命周期的管理&#…

大厂月薪15K被优化,面试 “吹牛” 入职小厂,月薪25K 好慌...

某大厂员工被优化&#xff0c;面试“吹牛”入职小厂&#xff0c;纠结去不去&#xff0c;心里有点慌。 作为一个从福报厂出来的HR&#xff0c;目前在100多人的小厂当HR总监。面对这种情况已经是见怪不怪了。作为小厂&#xff0c;没有大厂那么严格的背调&#xff0c;所以有些来自…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用&#xff0c;就是让Internet上的其他用户&#xff0c;可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后&#xff0c;在Internet下的其它电脑、手机等网络设备&#xff0c;将无法自接访问你电脑…

C++ 反汇编简要

摘要&#xff1a;本文主要描述x86_64机器中C代码在汇编中的具体代码。   关键字&#xff1a;cpp,IA32,asm   注意&#xff1a;本书假定你拥有基本的C软件开发能力&#xff0c;能够理解基本的C代码。并且熟悉汇编代码&#xff0c;了解基本的取址模式并且熟悉IA32指令集&…

基于LDA与PCA算法的鸢尾花数据集二维投影比较

目录 1. 作者介绍2. LDA和PCA算法介绍2.1 LDA算法2.2 PCA算法2.3 两个算法的区别与联系 3. 实验过程3.1 数据集介绍3.2 算法流程3.3 核心算法介绍3.4 完整代码3.5 实验结果与分析 1. 作者介绍 王鑫&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生…

70+页实战经验分享,《研发效能红宝书》重磅发布 | 附下载

研发效能提升方法从来没有标准答案&#xff0c;不同角色的人&#xff0c;以不同的目标搭建效能体系的方法千差万别&#xff0c;但又存在互通之处。所以做研发效能更需要多方借鉴&#xff0c;然后因地制宜&#xff0c;找到适合自己的方式。于是&#xff0c;我们汇集业界多位效能…

shell脚本解析 01

一、shell 概述 1.shell 的两层含义&#xff1a; 既是一种应用程序,又是一种程序设计语言 a.作为应用程序&#xff1a; 交互式地解释、执行用户输入的命令&#xff0c;将用户的操作翻译成机器可以识别的语言&#xff0c;完成相应功能。称之为 shell 命令解析器。shell 是用户和…