【数据结构】72变的双端队列

双端队列

  • 前言
  • 一、双端队列
    • 1.1 双端队列的定义
    • 1.2 输入受限的双端队列
    • 1.3 输出受限的双端队列
    • 1.5 输入输出都受限的双端队列
    • 1.6 小结
  • 二、双端队列的使用
    • 2.1 双端队列的出队序列——暴力求解
      • 2.1.1 栈的出栈序列
      • 2.1.2 输入受限的双端队列
      • 2.1.3 输出受限的双端队列
      • 2.1.4 输入输出都受限的双端队列
      • 2.1.5 小结
    • 2.2 双端队列的出队序列——经验法
  • 总结

封面

前言

大家好,很高兴又和大家见面啦!!!
在前面的篇章中,咱们详细介绍了队列这种新的数据结构,现在我们简单的回顾一下队列的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。

数据的逻辑结构

  • 队列的数据元素在逻辑上是呈现线性结构,也就是说队列也是一种线性表,只不过是一种操作受限的线性表。

数据的存储结构

  • 队列中的数据元素在内存空间中可以通过顺序存储和链式存储两种方式进行存储。
  • 通过顺序存储实现的队列我们称之为循环队列,循环队列的空间大小是不可改变的,循环的实现是通过取模运算实现数组下标的循环;
  • 通过链式存储实现的队列我们称之为链队列,链队列是通过队头指针与队尾指针分别指向单链表的表头与表尾进行实现;

数据的运算

  • 在逻辑结构上队列是属于一种操作受限的线性表,队列中的元素只能从一端已进行插入,从另一端进行删除,因此我们可以定义在队列上的基本操作有:
    • 创建、销毁、从队尾进行增加、从队头进行删除、判空、查找队头元素;
  • 在存储结构上队列在不同的存储结构下对各操作实现的方式也有区别:
    • 顺序存储:在顺序存储中,我们进行增加与删除的操作是通过队头指针与队尾指针存储的数组下标的修改来实现的,因为数组的大小是预先申请好的,因此在顺序存储中我们还需要对队列进行判满的操作,根据不同的满队条件,我们可以进行三种方式来实现队列——空间置换法、队长法以及标志法;
    • 链式存储:在链式存储中,队列对空间的使用更加的灵活,理论上将只要内存空间足够大,队列就不会出现满队的情况。在链式存储的实现中我们在定义数据类型时要将队列中各个结点的数据类型与队列的数据类型分开定义,确保我们创建的队列是通过头尾指针指向各个结点的队列。

到这里队列的三要素我们就已经复习完了。

在今天的内容中,我们将介绍一个武艺高超的队列——双端队列。它的武艺究竟高超在什么地方呢?下面我们一下来看一下吧!

一、双端队列

1.1 双端队列的定义

双端队列指的是运行在两端进行入队与出队操作的队列,其元素的逻辑结构依然是线性结构。在双端队列中我们将队列的两端分别称为前端和后端,两端都可以进行入队和出队。如下所示:
双端队列
在双端队列中由于它的前端与后端都能进行入队和出队,因此进行出队入队的元素满足下面的规则:

  • 从前端进的元素排列在队列后端进的元素的前面;
  • 从后端进的元素排列在队列前端进的元素的后面;
  • 无论是前端还是后端出队,先出的元素排列在后出的元素的前面。

在双端队列中,因为它的前端和后端都能够实现入队和出队,所以他会有不同的操作形式:

  • 当我们只看前端或者只看后端的话,我们就会发现,它其实是一个栈,因为只从一端进行入队和出队时,元素满足后进先出(LIFO)的操作特性;
  • 当我们只要求元素从前端进后端出,或者从后端进前端出的话,它此时就是一个队列,因为此时的双端队列满足先进先出(FIFO)的操作特性;

也就是说双端队列我们可以看做是栈和队列的结合体,那如果我们限制双端队列一端的输入或输出会是怎么样呢?下面我们一起来探讨一下;

1.2 输入受限的双端队列

当我们只允许双端队列的一端进行输入时,此时双端队列就会变成如下结构:
输入受限的双端队列
在这种情况下队列中的元素在入队时是只能从一端入队,但是出队不受限制,所以这种形式的双端队列满足以下操作特性:

  • 对于允许入队的一端来说,元素满足后入先出(LIFO)的操作特性;
  • 对于入队受限的一端来说,元素满足先入先出(FIFO)的操作特性;

1.3 输出受限的双端队列

当我们只允许双端队列的一端输出时,此时的双端队列就会变成如下结构:
输出受限的双端队列
在这种情况下,双端队列只能从一端进行出队,入队不受影响,因此这种形式的双端队列满足以下操作特性:

  • 在允许出队的一端,元素满足LIFO的操作特性;
  • 在出队受限的一端,元素满足FIFO的操作特性;

1.5 输入输出都受限的双端队列

当我们只允许双端队列中的元素从哪一端进就从哪一端出的话,此时的双端队列就会变成两个栈底相邻的栈,如下所示:
输入输出都受限的双端队列

在这种情况下不管是从前端入队的元素还是从后端入队的元素都满足LIFO的操作特性。

这时可能有朋友会说,我能不能限制只能从一端进从另一端出呢?就如下面这样:
输入输出都受限的双端队列2
从上图可以看到,如果只能限制从一端进另一端出的话,我们会发现此时的双端队列如果两个端都有元素入队的话,此时是没办法出队的,因此,我们在双端队列中不能限制元素只能从一端进、从另一端出。

1.6 小结

从上面的介绍中我们可以得出以下结论:

  1. 双端队列也是一种操作受限的线性表,它同时具有栈和队列的操作特性;
  2. 当双端队列的一端的输入/输出受限时,受限制的一端的满足队列的操作特性,另一端满足栈的操作特性;
  3. 当双端队列的输入和输出都受限时,此时的双端队列就会变成两个栈底相邻的栈。

介绍到这里,可能会有朋友有疑问了,我既然已经有了栈和队列这两种数据结构,现在将它们组合在一起是为什么呢?双端队列究竟有什么作用呢?下面我们就一起来探讨一下;

二、双端队列的使用

在数据结构这门科目中,目前我对双端队列的理解是——双端队列主要出现在元素的排序上,考试中一般也只是出现在选择题中,题目会要求我们判断四个选项中哪个选项符合双端队列的操作特性,或者不符合双端队列的操作特性。

下面我们通过【2010年的统考真题】来介绍双端队列的使用;

【2010统考真题】某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,若元素a、b、c、d、e依次入此队列后再进行出队操作,则不可能得到的出队序列是()。
A.b,a,c,d,e
B.d,b,a,c,e
C.d,b,c,a,e
D.e,c,b,a,d

对于这一道题,我们应该如何来求解呢?下面我将自己的解题思路分享给大家;

2.1 双端队列的出队序列——暴力求解

首先我先介绍的是一种比较基础的解法——暴力求解,何为暴力呢?就是将双端队列中的元素的所有情况全部列出来,比如,我要求解a,b,c,d四个元素在双端队列中的出队序列,如果我们要对4个元素进行排列组合的话,我就可以得到4!种,如下所示:

a,b,c,d    b,c,d,a    c,d,a,b    d,a,b,c
a,b,d,c    b,c,a,d    c,d,b,a    d,a,c,b
a,c,d,b    b,d,a,c    c,a,b,d    d,b,c,a
a,c,b,d    b,d,c,a    c,a,d,b    d,b,a,c
a,d,b,c    b,a,c,d    c,b,a,d    d,c,a,b
a,d,c,b    b,a,d,c    c,b,d,a    d,c,b,a

那是不是说这24中序列都是有效序列呢?下面我们就来逐个分析在不同形式的双端队列的情况下它们所能进行的排列组合的情况;

2.1.1 栈的出栈序列

对于双端队列而言,既然它是栈和队列的结合体,那么栈所满足的出队序列,双端队列一定满足,因此我们先来分析一下根据栈的特性,它能够得到哪些出队序列;

栈的操作特性是后入先出,那么对栈而言我们在保证abcd这四个元素时按顺序依次入栈的条件下,要想使元素d第一个出栈,那么abc的出栈顺序必然是cba,如下所示:
栈的出队序列
也就是说,如果我要让元素d第一个出栈,那么只会存在一种出栈序列——d,c,b,a

同理,当我需要让元素c第一个出栈时,那对于元素b和元素a而言,它们的次序肯定是b先出栈,a再出栈,那我们就能得到3种序列——c,d,b,a/c,b,d,a/c,b,a,d

当我们要让元素b先出栈时,此时第二个出栈的元素可以是a、c、d任意一个,当第二个出栈元素为d时,那么对于元素c和元素a来说,它们的出栈次序肯定是c先出,a后出,如下所示:
以bd为序的入栈出栈演示
因此当以元素d先出栈时,我们可以得到5个出栈序列——b,a,c,d/b,a,d,c/b,c,a,d/b,c,d,a/b,d,c,a

同理,当我们让a先出栈,d第二个出栈时,元素b和元素c的出栈顺序肯定是c,b,这里我就不演示了,也就是说此时我们也同样可以得到5个出栈序列——a,b,c,d/a,b,d,c/a,c,b,d/a,c,d,b/a,d,c,b

对于栈而言,现在有以下这些序列是不满足栈的出栈序列的:
a,d,b,c/b,d,a,c/c,d,a,b/c,a,b,d/c,a,d,b/d,a,b,c/d,a,c,b/d,b,a,c/d,b,c,a/d,c,a,b
之所以不满足,就是因为出栈和入栈受到了限制,那如果在双端队列中,这些序列又会如何呢?

2.1.2 输入受限的双端队列

当在输入受限的双端队列中,输出是不受影响的,因此对于a,d,b,c这个序列而言它则可行起来了,如下所示:
输入受限的双端队列
因为两端都能出队,所以我只要按顺序进行入队,那么对于以a开始出队的序列是全部可行的,同样,此时以d开头的序列也会多出以下三种情况——d,a,b,c/d,a,c,b/d,c,a,b

这是因为我们只能从一端输入,而要想使d先出队的话,那元素a,b,c肯定已经入队,之后我们才能开始进行出队操作;

同理,当我们想要让c先出队时,那元素a、b肯定已经入队,之后我们再进行出队操作的话,那对于序列c,a,b,c/c,a,d,b/c,d,a,b而言都是可以实现的了;

当我们想要让元素b先出队时,那对于b,d,a,c这个出队序列也是可以实现的了;

因此,在输入受限的双端队列中,只有d,b,a,c/d,b,c,a是无法实现的;

2.1.3 输出受限的双端队列

当在输出受限的双端队列中,我们要想得到对应的输出序列,只能够通过输入的方式来将其顺序进行排列,那在下面这些不满足栈的出栈序列中,又会有哪些是符合要求的呢?我们一起来看一下;
a,d,b,c/b,d,a,c/c,d,a,b/c,a,b,d/c,a,d,b/d,a,b,c/d,a,c,b/d,b,a,c/d,b,c,a/d,c,a,b

对于序列a,d,b,c而言,我们可以通过两端入队的方式来实现,如下所示:
输出受限的双端队列
同理,当b要先输出的话,那我们的输入输出顺序就是:a入队->b入队->b出队->c从受限制的一端入队->d入队——此时队列里的排列顺序是d,a,c。之后我们只需要依次执行出队就能得到b,d,a,c的出队次序了;

当c要先输出时,也就是说a和b已经入队了,下面我们来看一下如何实现c,d,a,b/c,a,b,d/c,a,d,b这三种情况的排序;

首先我们来看第一种——c,d,a,b,对应的出入队情况如下所示:
输出受限的双端队列2
可以看到只要我们保证dab入队后的排列顺序就能完成对应的出队序列;

然后我们再来看一下c,a,b,d,对应的出入队情况如下所示:
输出受限的双端队列3
可以看到在这种情况下我们可以通过输入端的不同完成对应的元素的排列顺序,然后依次出队即可;

接着我们再来看一下c,a,d,b,对应的出入队情况如下所示:
输出受限的双端队列4
可以看到不管我们怎么进行输入,只要是c入队了,那a和b就肯定是已经入队了,因此a和b的出队顺序可以颠倒但是不可能会被隔开,因此在输出受限的双端队列中,这个出队序列是无法实现的。

同理,当d先出队时,我们只需要观察能不能通过入队的先后顺序来完成出队时的次序。此时有
d,a,b,c/d,a,c,b/d,b,a,c/d,b,c,a/d,c,a,b这五种情况等待我们验证,当d要第一个出队的话,那势必a,b,c都以完成了入队,也就是说,a和b的位置关系肯定是紧邻着的,那么我们就可以直接排除d,a,c,bd,b,c,a这两种情况了。

因此在输出受限的双端队列中c,a,d,b/d,a,c,b/d,b,c,a这三种情况是无法实现的;

2.1.4 输入输出都受限的双端队列

当输入和输出都受限时,不管元素是从哪端进入,都是满足LIFO这个操作特性。在这种情况下
a,d,b,c/b,d,a,c/c,d,a,b/c,a,b,d/c,a,d,b/d,a,b,c/d,a,c,b/d,b,a,c/d,b,c,a/d,c,a,b这些输出序列又能不能实现呢?我们继续来看一下;

对于a,d,b,c这个输出序列,它的输入输出情况如下所示:
输入输出都受限的双端队列

可以看到此时我们是可以通过不同端的输入来完成对应的出队次序的排列的,接下来只需要按照对应的次序进行出队即可;

下面我们再来看看b,d,a,c这种情况,对应的出入队情况如下所示:
输入输出都受限的双端队列2
可以看到通过两端的入队与出队也是能够实现对应的出队次序的;

下面我们再看看c,d,a,b/c,a,b,d/c,a,d,b这三种情况,如下所示:
输入输出都受限的双端队列3
可以看到,此时我们只要完成了前面两个元素的出队之后,后面两个元素的次序是可以颠倒的,因此以c为第一个出队元素的所有情况都是可以实现的;

接下来就是最关键的d了,因为d要先出队的话,那必须要将abc都先完成入队,在d,a,b,c/d,a,c,b/d,b,a,c/d,b,c,a/d,c,a,b这五种情况中,我们将其拆分成3种情况——da、db和dc,它们对应的出入队情况如下所示:

输入输出都受限的双端队列4
可以看到当要确保a是第二个出队时,那么b和c就不能和a在同一边,因此,b和c的出队顺序是一定的,所以对于d,a,b,c这种情况就不可能发生;

当第二个出队元素为b或者c时,此时我们都可以通过调整abc的入队位置来实现对应的出队序列,因此d,b,a,c/d,b,c,a/d,c,a,b这三种情况都是可以实现的;

所以在输出输入都受限时,只有d,a,b,c这种情况就不可能发生;

那如果我们不对输入和输出进行限制的话,我们会发现d,a,b,c也是可以实现的,如下所示:
输入输出不受限制的双端队列
也就是说,对于不受限制的双端队列它可能存在的出队情况就是n!

2.1.5 小结

现在我们已经介绍完了不同情况下的双端队列可能出现的出队次序,如果给这些元素的入队顺序进行编号的话,那么a,b,c,d的入队序号依次是1,2,3,4,现在我们可以根据这个入队序号做个总结:

  • 在输入输出不受限制的双端队列中,元素可以以任意次序完成出队;
  • 在输入受限的双端队列中,4号元素要先出队的话,1号元素与2号元素的出队一定是紧邻的;
  • 在输出受限的双端队列中,当3号元素和4号元素要完成先出队的话,那么1号元素和2号的出队一定是紧邻的;
  • 在输入输出都受限的双端队列中,当4号元素与1号元素要完成先后出队的话,那么2号元素和3号元素的出队顺序一定是32;
  • 在栈中,当4号元素要在第一或者第二个进行出栈时,剩下的两个元素的出栈次序一定是满足LIFO;

现在对于4个元素的出入队情况我们就已经分析完了,可以看到,如果是元素比较少的情况下,这种暴力求解的方式也是不错的,但是如果遇到了如10年的真题卷一样的有5个元素时,我们如果使用这种方法的话明显是不合理的,那我们又应该如何处理呢?下面我就要介绍第二种方法——经验法;

2.2 双端队列的出队序列——经验法

经验法是根据暴力求解法的归纳总结,在介绍我的结论之前,我们先要思考一个问题,为什么会有这些不符合条件的情况发生?

我相信有朋友已经想到了,因为栈和队列操作特性的约束,栈中的元素要满足LIFO,而队列中的元素要满足FIFO,因此当元素是从一端入队,同一端出队时,元素的出队符合LIFO,当元素从一端入队另一端出队时,元素的出队符合FIFO;

在理解了这个点之后,再来看一下我对双端队列的个人理解与总结:

  • 对于栈而言,越是入栈次序靠后的元素要先完成出栈时,它前面元素的出栈顺序一定是按照LIFO
  • 对于输入受限的双端队列,入队次序越靠后的元素要先完成出队,那次序越靠前的元素在进行出队时一定与入队次序紧跟它的元素相邻
  • 对于输出受限的双端队列,入队次序靠后的元素要先完成出队,那次序靠前的元素一定是紧邻的
  • 对于输入输出都受限的双端队列,入队次序越靠后的元素,与入队次序越靠前的元素进行先后出队时,中间的元素的出队次序一定是遵循LIFO

根据这个结论,下面我们直接来看一下真题的题目:

【2010统考真题】某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,若元素a、b、c、d、e依次入此队列后再进行出队操作,则不可能得到的出队序列是()。
A.b,a,c,d,e
B.d,b,a,c,e
C.d,b,c,a,e
D.e,c,b,a,d

从题目中我们可以得到结论,这是一个输出受限的双端队列,根据我们的结论,越是靠后的元素要先完成出队,次序靠前的元素一定是紧邻的。下面我们再来看选项:

  • A选项中是以b为第一个出队元素进行的出队那么这个序列肯定是存在的,直接跳过;
  • B和C选项都是以d为第一个出队元素,按照我们的结论,靠前的元素一定时紧邻的,也就是说a和b一定是先后进行出队的,顺序可以改变,但位置关系不能变,因此C选项是错误的;
  • D选项中是以e为第一个出队元素,那么a和b一定是紧邻的,b和c一定是紧邻的,可以看到它的出队次序是没问题的;

因此这一题选C,下面我们就来通过画图验证一下结论,如下所示:
经验法

可以看到在C选项中不管c元素从哪端入队,都不可能在a和b的中间,因此C选项错误。

PS: 这里分享的经验纯属我个人的一个思考总结,不一定完全正确,所以希望大家在做题时可以通过画图法来验证一下答案是否正确。

总结

在今天的篇章中,我们详细的探讨了一下不同形态的双端队列以及双端队列的使用,并且今天还将我自己压箱底的经验分享了出来,希望能够帮助各位更好的理解双端队列以及它的使用,如果对于相关的知识点还有疑问的话可以在评论区进行提问,我会尽快给大家进行答疑的哦!

最后感谢大家的翻阅,咱们下一篇再见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt基础-项目中添加文件夹及子文件

本文讲解Qt项目中添加文件夹 1、项目中新建文件夹 打开工程目录,在目录下建立文件夹,如建立文件Dialogs 2、移入文件 将需要归类的头文件.h和源文件.cpp放入该文件夹下; 3、4、项目-右键-添加现有文件 查看Pro文件 发生了改变 4、也可以采…

Spring 声明式事务讲解,和 @Transactional注解的用法

目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、Transactional注解的用法 一、Spring框架介绍 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型&a…

【第六课课后作业】大模型评测

大模型评测 大模型评测安装环境安装数据准备查看支持的数据集和模型 启动测评评测结果 大模型评测 安装 环境安装 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/ope…

一、Lamdba 表达式与函数式接口(最终版)

一、Lamdba 表达式与函数式接口 1.1 Lamdba 表达式与函数式接口 1.1.1 Lambda 表达式概述 Lambda 表达式是 Java 8 引入的一个新特性Lambda 表达式可以被视为匿名函数允许在需要函数的地方以更简洁的方法定义功能Lambda 表达式可以完成简洁的函数定义Stream API 中大量使用了…

基于静态顺序表实现通讯录

目录 一、设计框架 1、功能要求​ 2、菜单函数的实现 二、头文件实现​ Contact.h SeqList.h 三、Test.h 四、通讯录的初始化和销毁 五、增加通讯录 六、在通讯录中查找姓名下标 七、删除通讯录 八、显示通讯录 九、查找通讯录 一、设计框架 test.c:通…

【学网攻】 第(5)节 -- Cisco VTP的使用

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan 前言 网络已经成为了我们生活中不可或缺的一部分,它连接了世界各地的人们,让信息和资…

重磅!证监会回应股市波动!2万亿元救市计划正在商榷!将提振比特币?

最近这段时间,国内资本市场震荡走弱、波动加大,一些投资者深感忧虑。多家机构表示,市场波动已引起高层的重视。 继1月23日,证监会党委扩大会议从宏观层面提出资本市场建设发力重点后,1月24日证监会副主席王建军的一席采…

【前端基础--4】

定位属性 position 可以将元素定位到你想要放到位置,使用方位值来进行移动(top,left,right,bottom)。 1.相对定位 position: relative; top: 20px; left: 20px; 以自身为定点进行移动,不会脱离文档流。 不会影响元素本身的性质;块级…

YOLOv5改进系列(28)——添加DSConv注意力卷积(ICCV 2023|用于管状结构分割的动态蛇形卷积)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【OpenCV学习笔记22】- OpenCV中的轮廓 - 开始了解轮廓

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

解密:消息中间件的选择与使用:打造高效通信枢纽

目录 第一章:消息中间件介绍 1.1 什么是消息中间件 1.2 消息中间件的作用 1.3 消息中间件的分类 第二章:消息中间件的选择标准 2.1 性能 2.2 可靠性 2.3 可扩展性 2.4 易用性 2.5 社区支持 2.6 成本 第三章:常见的消息中间件对比…

Java 接口与内部类

目录 1、什么是接口? 1、接口中成员变量的访问特点 2、接口中成员方法的访问特点 3、接口是没有构造方法的 4、猫和狗接口代码演示 5、接口和类的关系 6、接口练习案例 2、什么是内部类 1、概念 2、成员内部类 3、静态内部类 4、局部内部类 5、匿名内部…

Linux文本编辑器-vi/vim

一.vi/vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本,兼容 vi 的所有指令,不仅能编辑文本,而…

Linux——服务器管理建议

1、学习Linux的注意事项 1.1、Linux严格区分大小写 Linux是严格区分大小写的,这一点和Windows不一样,所以操作时要注意区分大小写的不同,包括文件名和目录名、命令、命令选项、配置文件设置选项等。 1.2、Linux中所有内容以文件形式保存 …

Qt6入门教程 11:父子对象关系

在上一篇中的纯手写部分,不管是创建菜单、工具栏还是状态栏,我们new完之后都未显式的调用delete进行销毁,这样难道不会有内存泄漏么? QMenuBar *menuBar new QMenuBar(this); QToolBar *toolBar new QToolBar(this); QStatusBa…

OpenHarmony从TypeScript到ArkTS的适配规则

本文通过提供简洁的约束,将标准的TypeScript代码重构为ArkTS代码。 尽管ArkTS是基于TypeScript设计的,但出于性能考虑,一些TypeScript的特性被限制了。因此,在ArkTS中,所有的TypeScript特性被分成三类。 完全支持的特…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时,临时提升为超级用户。例如,普通用户可以使用sudo执行系统管理任务,如安装软件、修改系统配置等。访问控制:sudo命令通过sudoers文件中的配置,可以对用…

什么是Spring

文章目录 什么是Spring什么是 IoC Spring的IoCDI的概念 什么是Spring Spring 是一个包含了众多工具方法的 IoC容器。 什么是 IoC Inversion of Control — 控制反转 在传统的开发中,假设A类依赖于B类,那么创建A对象实例就需要先new一个B类对象&#x…

【操作系统】实验八 proc文件系统

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

网络原理-初识(2)

协议分层 对于网络协议来说,往往分成几个层次进行定义. 网络通信的过程中,需要涉及到的细节,其实非常多.如果要有一个协议来完成网络通信,就需要约定好方方面面的内容,导致非常复杂. 而如果拆分的话,就十分复杂,庞大,因此需要分层. 什么是协议分层 即只有相邻的层次可以沟通,…