数据结构

合集下载

数据结构的基本概念

数据结构的基本概念

数据结构的基本概念
数据结构是计算机科学中用于组织和管理数据的方式。

它涉及将数据元素组织成特定的方式,以便能够有效地存储、检索和操作数据。

数据结构有很多种类,其中一些常见的包括数组、链表、栈、队列、树和图。

每种数据结构都有其特定的特点和应用场景。

数组是一种线性数据结构,它将相同类型的数据元素存储在连续的内存位置上,并使用索引来访问和操作数据。

链表也是一种线性数据结构,它由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表的优点是可以动态地添加或删除节点,但访问元素时需要遍历链表。

栈是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。

常见的应用场景包括函数调用、表达式求值和浏览器的历史记录。

队列是一种先进先出(FIFO)的数据结构,允许在一端插入元素,在另一端删除元素。

队列常用于实现任务调度、消息传递和缓冲区管理等场景。

树是一种非线性的数据结构,它由节点和边组成,每个节点可以有零个或多个子节点。

树的应用包括文件系统、数据库索引和组织结构图。

图是由节点和边组成的一种非线性数据结构,节点之间的边可以是有向的或无向的。

图的应用包括社交网络、路由算法和地图导航。

了解不同的数据结构以及它们的特点和应用场景,可以帮助开发者选择合适的数据结构来解决问题,并提高程序的效率和性能。

数据结构

数据结构

第1章绪论1.1 什么是数据结构数据与数据之间的关系1.2 基本概念和术语1.基本定义(1).数据(Data) :是客观事物的符号表示。

在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素(Data Element) :是数据的基本单位,在程序中通常作为一个整体来进行考虑和处理。

(2)数据项(Data Item):一个数据元素可由若干个数据项组成。

数据项是数据的不可分割的最小单位。

数据项是对客观事物某一方面特性的数据描述。

数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。

2.举例如字符集合C={‘A’,‘B’,‘C’,…}--C表示字符对象;A ,B等表示数据元素;再如学生集合Students={“Zhangsan”, “Lisi”,…}Zhangsan(ID,name,age,grade,…)……--Students表示学生对象;“Zhangsan”、“Lisi”表示数据元素;Zhangsan的ID、name、age等表示数据项。

3.数据结构的形式定义数据结构的形式定义是一个二元组:Data-Structure=(D,S)其中:D是数据元素的有限集,S是D上关系的有限集4.逻辑结构与物理结构(1)数据元素之间的关系可以是元素之间代表某种含义的自然关系,也可以是为处理问题方便而人为定义的关系,这种自然或人为定义的“关系”称为数据元素之间的逻辑关系,相应的结构称为逻辑结构。

(2)数据结构在计算机中的表示(映像)称为数据的物理结构。

数据结构的存储方式1)顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。

2)链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer ),用该指针来表示数据元素之间的逻辑结构(关系)。

3)例:设有数据集合A={3.0,2.3,5.0,-8.5,11.0} ,两种不同的存储结构。

数据结构ppt课件

数据结构ppt课件

数据结构的定义数据结构是计算机中存储、组织数据的方式,它定义了数据元素之间的逻辑关系以及如何在计算机中表示这些关系。

提高算法效率合适的数据结构可以显著提高算法的执行效率,降低时间复杂度和空间复杂度。

简化程序设计数据结构为程序设计提供了统一的抽象层,使得程序员可以更加专注于问题本身,而不是底层的数据表示和访问细节。

便于数据管理和维护良好的数据结构设计可以使得数据的管理和维护变得更加方便和高效。

数据结构的定义与重要性线性数据结构中的元素之间存在一对一的关系,如数组、链表、栈和队列等。

线性数据结构非线性数据结构中的元素之间存在一对多或多对多的关系,如树、图等。

非线性数据结构静态数据结构在程序运行期间不会发生改变,如数组、静态链表等。

静态数据结构动态数据结构在程序运行期间可以动态地添加或删除元素,如链表、动态数组等。

动态数据结构数据结构的分类01020304在计算机科学中,数据结构是算法设计和分析的基础,广泛应用于操作系统、编译原理、数据库等领域。

计算机科学在软件工程中,数据结构是软件设计和开发的重要组成部分,用于实现各种软件功能和性能优化。

软件工程在人工智能中,数据结构用于表示和处理各种复杂的数据和知识,如神经网络、决策树等。

人工智能在大数据处理中,数据结构用于高效地存储、管理和分析海量数据,如分布式文件系统、NoSQL 数据库等。

大数据处理数据结构的应用领域0102线性表是具有n个数据元素的有限序列创建、销毁、清空、判空、求长度、获取元素、修改元素、插入元素、删除元素等线性表的定义线性表的基本操作线性表的定义与基本操作03用一段地址连续的存储单元依次存储线性表的数据元素顺序存储结构的定义可以随机存取,即可以直接通过下标访问任意元素;存储密度高,每个节点只存储数据元素顺序存储结构的优点插入和删除操作需要移动大量元素;空间利用率不高,需要提前分配存储空间顺序存储结构的缺点链式存储结构的定义01用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的链式存储结构的优点02插入和删除操作不需要移动大量元素,只需要修改指针;空间利用率高,不需要提前分配存储空间链式存储结构的缺点03不能随机存取,只能通过从头节点开始遍历的方式访问元素;存储密度低,每个节点除了存储数据元素外,还需要存储指向下一个节点的指针0102定义栈(Stack)是一种特殊的线性数据结构,其操作只能在一端(称为栈顶)进行,遵循后进先出(LIFO)的原则。

常见的数据结构有哪些

常见的数据结构有哪些

常见的数据结构有哪些数据结构是一种用于组织和存储数据的方法。

在计算机科学中,数据结构是必不可少的,因为它们用于存储和管理大量的数据。

常见的数据结构包括数组、链表、栈、队列、哈希表和树等。

本文将详细介绍这些数据结构的定义、特点和应用。

一、数组数组是一种非常基本的数据结构,它是一组相同类型的数据元素的集合。

数组的每个元素可以通过索引访问,索引从零开始,并按顺序排列。

数组中的元素可以是任何数据类型,比如整数、浮点数、字符或字符串等。

数组的主要特点是访问元素的时间复杂度为O(1),查找和修改元素都非常快,但插入和删除元素的时间复杂度较高,为O(n)。

因此,数组适合用于静态的、预先知道元素数目的情况下,而不适合在动态的数据集合中进行插入和删除操作。

二、链表链表是一种动态的、常用于动态内存分配的数据结构。

链表由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的指针。

链表的首节点称为头结点,最后一个节点称为尾节点,尾节点的指针指向NULL或空。

链表可以分为单向链表和双向链表。

单向链表只有一个指针指向下一个节点,而双向链表有两个指针,一个指向前一个节点,一个指向后一个节点。

链表的主要特点是插入和删除元素的时间复杂度为O(1),因为只需要修改链表中的节点指针,而不需要整体移动元素。

但是,访问元素的时间复杂度为O(n),因为链表中的元素不是连续的,需要从头结点开始遍历整个链表。

三、栈栈是一种具有“先进后出”(Last In First Out,LIFO)特点的数据结构。

栈的操作包括push(入栈)和pop(出栈),压入栈中的最后一个元素会成为第一个出栈的元素。

栈的主要应用是在函数调用中保存临时变量和返回地址。

当一个函数被调用时,它的局部变量和参数被压入栈中,然后函数返回时,这些变量和参数被弹出栈。

栈也用于处理表达式、计算器、括号匹配、深度优先搜索和回溯算法等。

通常,栈的实现采用链表或数组。

四、队列队列是一种具有“先进先出”(First In First Out,FIFO)特点的数据结构。

数据结构名词解释

数据结构名词解释

数据结构名词解释数据结构名词解释:⒈数组(Array):是一种线性数据结构,存储相同类型的元素。

通过索引访问元素,具有随机访问的特性。

⒉链表(Linked List):是一种线性数据结构,由节点组成。

每个节点包含数据和指向下一个节点的引用。

链表分为单向链表和双向链表。

⒊栈(Stack):是一种后进先出(LIFO)的数据结构,只允许在栈的一端进行插入和删除操作。

⒋队列(Queue):是一种先进先出(FIFO)的数据结构,允许在队列的一端进行插入操作,在另一端进行删除操作。

⒌树(Tree):是一种由节点组成的层次结构,每个节点可以有零个或多个子节点。

常见的树结构包括二叉树、二叉搜索树、AVL 树等。

⒍图(Graph):是一种由节点和边组成的数据结构,在图中节点之间可以有直接或间接的连接。

⒎哈希表(Hash Table):是一种根据键值(Key-Value)对进行快速访问的数据结构。

通过哈希函数对键值进行映射,将其存储在数组中。

⒏堆(Heap):是一种完全二叉树的结构,满足特定的堆序性质。

堆可以用来实现优先队列、堆排序等。

⒐图算法(Graph Algorithm):是在图数据结构上进行的操作和计算,包括深度优先搜索、广度优先搜索、最短路径算法等。

⒑查找算法(Search Algorithm):是在数据集中查找目标元素的算法,包括线性查找、二分查找、哈希查找等。

1⒈排序算法(Sorting Algorithm):是将数据集中的元素按照特定顺序排列的算法,包括冒泡排序、插入排序、快速排序等。

1⒉动态规划(Dynamic Programming):是一种通过将问题划分为子问题,并将子问题的解记录下来以解决整个问题的算法。

1⒊贪心算法(Greedy Algorithm):是一种通过每一步选择局部最优解来达到全局最优解的算法。

1⒋回溯算法(Backtracking Algorithm):是一种通过试错的方式,在问题的所有可能解中搜索最优解的算法。

数据结构

数据结构

数据结构是指同一数据元素类中各数据元素之间存在的关系。

数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。

数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。

逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。

数据元素相互之间的关系称为结构。

有四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。

树形结构和图形结构全称为非线性结构。

集合结构中的数据元素除了同属于一种类型外,别无其它关系。

线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。

在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。

数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。

它包括数据元素的表示和关系的表示。

数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。

顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。

顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。

链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。

由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。

索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。

数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。

线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。

线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。

数据结构 知识点总结

数据结构 知识点总结

数据结构知识点总结一、数据结构基础概念数据结构是指数据元素之间的关系,以及对数据元素进行操作的方法的总称。

数据结构是计算机科学中非常基础的概念,它为计算机程序的设计和实现提供了基础架构。

数据结构的研究内容包括数据的逻辑结构、数据的存储结构以及对数据进行操作的算法。

1.1 数据结构的分类数据结构可以根据数据的逻辑关系和数据的物理存储方式进行分类,常见的数据结构分类包括线性结构、树形结构、图结构等。

1.2 数据结构的基本概念(1)数据元素:数据结构中的基本单位,可以是原子类型或者复合类型。

(2)数据项:数据元素中的一个组成部分,通常是基本类型。

(3)数据结构的逻辑结构:指数据元素之间的逻辑关系,包括线性结构、树形结构、图结构等。

(4)数据结构的存储结构:指数据元素在计算机内存中的存储方式,包括顺序存储结构和链式存储结构等。

1.3 数据结构的特点数据结构具有以下几个特点:(1)抽象性:数据结构是对现实世界中的数据进行抽象和模型化的结果。

(2)实用性:数据结构是在解决实际问题中得出的经验总结,是具有广泛应用价值的。

(3)形式化:数据结构具有精确的数学定义和描述,可以进行分析和证明。

(4)计算性:数据结构是为了使计算机程序更加高效而存在的。

二、线性结构线性结构是数据元素之间存在一对一的关系,是一种最简单的数据结构。

常见的线性结构包括数组、链表、栈和队列等。

2.1 线性表线性表是数据元素之间存在一对一的关系的数据结构,可以采用顺序存储结构或者链式存储结构实现。

(1)顺序存储结构:线性表采用数组的方式进行存储,数据元素在内存中连续存储。

(2)链式存储结构:线性表采用链表的方式进行存储,数据元素在内存中非连续存储,通过指针将它们进行连接。

2.2 栈栈是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端称为栈顶。

栈的操作遵循后进先出(LIFO)的原则。

2.3 队列队列也是一种特殊的线性表,允许在一端进行插入操作,另一端进行删除操作,这两端分别称为队尾和队首。

《数据结构》课件

《数据结构》课件

第二章 线性表
1
线性表的顺序存储结构
2
线性表的顺序存储结构使用数组来存储元素,
可以快速随机访问元素。
3
线性表的常见操作
4
线性表支持常见的操作,包括插入、删除、 查找等,可以灵活地操作其中的元素。
线性表的定义和实现
线性表是一种数据结构,它包含一组有序的 元素,可以通过数组和链表来实现。
线性表的链式存储结构
线性表的链式存储结构使用链表来存储元素, 支持动态扩展和插入删除操作。
第三章 栈与队列
栈的定义和实现
栈是一种特殊的线性表,只能在一 端进行插入和删除操作,遵循后进 先出的原则。
队列的定义和实现
队列是一种特殊的线性表,只能在 一端进行插入操作,在另一端进行 删除操作,遵循先进先出的原则。
栈和队列的应用场景和操作
哈希表是一种高效的查找数据结构, 通过哈希函数将关键字映射到数组 中,实现快速查找。
排序算法包括冒泡排序、插入排序 和快速排序等,可以根据数据规模 和性能要求选择合适的算法。
结语
数据结构的学习心得 总结
学习数据结构需要掌握基本概念 和常见操作,通过实践和练习加 深理解和熟练度。
下一步学习计划的安 排
在掌握基本数据结构的基础上, 可以进一步学习高级数据结构和 算法,提升编程技能。
相关学习资源推荐
推荐一些经典的数据结构教材和 在线学习资源,如《算法导论》 和LeetCode等。
栈和队列在计算机科学中有许多应 用,如函数调用、表达式求值和作 业调度等。
第四章 树与二叉树
树的定义和性质
树是由节点和边组成的一种非线性数据结构,每个 节点可以有多个子节点。
二叉树的遍历方式
二叉树的遍历方式包括前序遍历、中序遍历和后序 遍历,可以按不同顺序输出节点的值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(5)串比较Str_Equal (s1,s2) 初始条件:串s1,s2存在。 操作结果:若s1==s2,返回值为1;否则返回结果为0。 int Str_Equal (char *s1,char *s2); 比较s1和s2大小,当s1<s2、s1>s2和s1=s2时, 分别返回 小于0、大于0和等于0的值 (6)子串定位 Str_Index(s,t):找子串t在主串s中首次 出现的位置。 操作条件:串s,t存在。 操作结果:若t∈s,则操作返回t在s中首次出现的位置, 否则返回值为-1。 如:Str_Index("abcdebda","bc")=2 Str_Index("abcdebda","ba")=-1
4.1.2 串的基本运算
(3)连接操作:Str_Concat (s1,s2) 初始条件:串s1,s2存在。 操作结果:将一个串的串值紧接着放在另一个串的后 面,连接成一 个串。 例如: s1="he",s2="nan",结果s1="henan"。 (4)求子串Str _ Sub (s,i,len) 初始条件:串s存在,1≤i≤StrLength(s), 0≤len≤StrLength(s)-i+1。 操作结果:返回从串s的第i个字符开始的长度为 len 的子 串。len=0得到的是空串。 例如:Str_Sub("abcdefghi",3,4)="cdef"。
}
(3)求串长度
ห้องสมุดไป่ตู้
初始条件:串s存在。
操作结果:把串的长度求出并返回。 int Str_Length(LiString *S)//求串的长度 { LiString *p=S->next; int i=0; while(p!=NULL) { p=p->next; i++; } return i; }
(4)求子串 初始条件:串s存在,1≤i≤s.len,0≤len≤s.len-i+1。 操作结果:返回从串s的第i个字符开始的长度为j的子串。 j=0得到的是空串。 操作步骤:找到第i个字符的位置,把t插入在s的第i个 字符的后面。
第四章
串和数组
数据结构
书名:数据结构 书号:978-7-11149031-9 作者:主 编 马世霞 出版社:机械工业出 版社 配套教案,习题答案
本章要点
串和数组的概念 串的简单应用 数组的存储形式
4.1 串及其基本运算
4.1.1 串的基本概念
1.串的定义 串是由零个或多个任意字符组成的字符序列。 一般记作:
(2)字符串比较
初始条件:串s,t存在。
操作结果:若s1==s2,操作返回值为1;否则返回结果为0。 int Str_Equal(SqString s,SqString t) { int same=1,i; if (s.len!=t.len) same=0; /*长度不相等时返回0*/ else for (i=0;i<s.len;i++) if (s.data[i]!=t.data[i]) /*有1个对应字符不同时返回0*/ { same=0; break; } return same; }
4.2串的定长顺序存储及基本运算
1、串的顺序存储就是把串所包含的字符序列依次存 入连续的存储单元中去,也就是用向量来存储串。 0 ‘D’ 1 ‘A’ 2 ‘ T’ 3 4 ‘A’ ‘\0’
2、顺序串的存储结构类型定义如下:
#define MaxSize 50 typedef struct { char data[MaxSize];
算法4.8如下: LiString *Str_Sub(LiString *L, int i, int j)//求子串 while(n<=i+j-1) { LiString *p=S->next,*h,*s,*q; {s=(LiString*)malloc(sizeof(LiString)); int n=1,t=Str_Length(L); q->next=s; h=(LiString*)malloc(sizeof(LiString)); q=s; h->next=NULL; s->data=p->data; if(i<=0||i>t||i+j-1>t||j<0) p=p->next; return h; n++; q=h; } while(n<i) s->next=NULL; { n++; p=p->next; } return h; }
int len;
} SqString;
(1)字符串赋值 初始条件: cstr是一个字符串常量。 操作结果:把字符串常量cstr的内容赋给str所指向的
存储空间。
void Str_Assign(SqString *str,char cstr[]) { int i; for(i=0;cstr[i]!='\0';i++) str->data[i]=cstr[i]; str-> data[i+1]='\0'; str-> len=i; }
(2)串连接
初始条件:串s1,,s2存在。 操作结果:两个串的联接就是将一个串的串值紧接着放在另一个 串的后面,连接成一个新串。
LiString * Str_Concat (LiString *s1, LiString *s2)//连接子串 { while(p2!=NULL) LiString *p1,*p2,*h,*s,*q; *p1=s1->next, {s=(LiString*)malloc(sizeof(LiString)); *p2=s2->next, q->next=s; h=(LiString*)malloc(sizeof(LiString)); h->next=NULL; q=s; q=h; s->data=p2->data; while(p1!=NULL) p2=p2->next; {s=(LiString*)malloc(sizeof(LiString)); q->next=s; } q=s; s->next=NULL; s->data=p1->data; p1=p1->next; return h; }
4.3 串的链式存储及基本运算 二、串的链式存储结构 1、串的链式存储就是采用单链表方式来存储串值。 方便插入和删除操作。
2、链串的存储结构类型定义如下: typedef struct node { char data; struct node *next; } LiString;
4.3 串的链式存储及基本运算 (1)串赋值 初始条件: L是一个指向串的指针,a是一字符串。 操作结果:将a串值赋值给L。
(4)求子串 初始条件:串s存在,1≤i≤s.len,0≤len≤s.len-i+1。 操作结果:返回从串s的第i个字符开始的长度为j的子串。 j=0得到的是空串。 SqString Str_Sub(SqString s,int i,int j) { SqString str; int k; str.len=0; if (i<=0 || i>s.len || j<0 || i+j-1>s.len) { printf("参数不正确\n"); return str; /*参数不正确时返回空串*/ } for (k=i-1;k<i+j-1;k++) /*s.data[i..i+j]=>str*/ str.data[k-i+1]=s.data[k]; str.len=j; return str; }
(3)字符串连接 初始条件:串s,t存在。 操作结果:将一个串s紧接着放在另一个串t的后面, 连接成一个新串s。 SqString Str_Concat(SqString s, SqString t) { SqString str; int i; str.len=s.len+t.len; for (i=0;i<s.len;i++) /*s.data[0..s.len-1]=>str*/ str.data[i]=s.data[i]; for (i=0;i<t.len;i++) /*t.data[0..t.len-1]=>str*/ str.data[s.len+i]=t.data[i]; return str; }
void Str_Assign(LiString *&S,char a[])//串的初始化 { LiString *p,*q; int j; S=( LiString *)malloc(sizeof(LiString)); q=S; for(j=0;a[j]!='\0';j++) { p=( LiString *)malloc(sizeof(LiString)); p->data=a[j]; q->next=p; p->next=NULL; q=p; } }
2、空串(string)是长度为零的串,它不 包含任何字符。例如: "" 3、空白串(string)是由一个或多个空格 组成的串。 例如: " "
2.常用术语
子串与主串:
串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
子串的位置:
子串的第一个字符在主串中的序号称为子串的位置。
【例4-1】设计顺序串上实现串比较运算 Str_cmp(s,t)的算法。 int Str_cmp(SqString s,SqString t)
#define MaxSize 100 #include<string.h> #include<stdio.h> typedef struct { char data[MaxSize]; int len; } SqString; void Str_Assign(SqString *str,char cstr[]) { int i; for(i=0;cstr[i]!='\0';i++) (*str).data[i]=cstr[i]; (*str).data[i+1]='\0'; (*str).len=i; } { int i,comlen; if(s.len<t.len) comlen=s.len;/*求s与t中较短的长度*/ else comlen=t.len; for(i=0;i<comlen;i++) /*逐个字符比较*/ if(s.data[i]<t.data[i]) return -1; else if(s.data[i]>t.data[i]) return 1; if(s.len==t.len) return 0; /*s==t*/ else if(s.len<t.len) return -1; /*s<t*/ else return 1; /*s>t*/ void main() } s1,s2; {SqString char cstr1[100],cstr2[100]; printf("请输入字符串s1:"); scanf("%s",cstr1); printf("请输入字符串s2:"); scanf("%s",cstr2); Str_Assign(&s1,cstr1);/*调用算法4.1,给s1赋值*/ Str_Assign(&s2,cstr2); /*调用算法4.1,给s2赋值*/ printf("返回值是:%d\n",Str_cmp(s1,s2)); }
相关文档
最新文档