没有合适的资源?快使用搜索试试~ 我知道了~
首页C#语言版数据结构详解
C#语言版数据结构详解
需积分: 50 1 下载量 118 浏览量
更新于2024-08-01
收藏 1.66MB PDF 举报
"数据结构(C#语言版)" 是一本针对使用C#语言讲解数据结构的教材,旨在填补国内此类教材的空白。书中结合了.NET Framework 2.0版本的背景,尽管在编写过程中C#和.NET已经有了更新版本,但依然保持了对基础概念和技术的深入解析。 在内容上,本书共分为8章。第1章首先引入了数据结构和算法的基础知识,涵盖了必要的数学概念和C#编程基础,为后续章节的学习打下坚实基础。接下来的第2章至第6章,作者详细阐述了常见的线性数据结构(如线性表、栈、队列)、非线性数据结构(如串、数组、树型结构、图结构)及其在实际应用中的作用,并探讨了.NET框架中对应的类库支持。这些章节通过具体的C#代码实现,帮助读者理解如何在C#环境下操作和管理数据。 第7章和第8章则转向了排序和查找算法,这是数据结构领域的重要组成部分。书中不仅详细解释了各种经典的排序(如冒泡排序、快速排序、归并排序等)和查找(如顺序查找、二分查找、哈希查找等)算法,还展示了这些算法在.NET框架中的实现,以便读者能够在实际开发中灵活运用。 本书的特点在于将抽象的数据结构理论与C#语言的实际编程紧密联系,同时融入了.NET框架的上下文,使得读者不仅能掌握数据结构的理论知识,还能掌握在实际开发环境中的应用技巧。此外,书中强调了不同语言在.NET平台上的互操作性,展示了C#作为.NET框架核心语言的重要地位。 "数据结构(C#语言版)"是一本适合C#开发者和学习者的实用教程,它结合了理论与实践,既适合课堂教学,也适用于个人自学,有助于提升读者在数据结构和算法方面的技能,从而在软件开发中实现更高效的数据管理和处理。
资源详情
资源推荐
1.4 C#预备知识 11
须实现 IComparable 接口。由可以排序的类型,例如值类型实现以创建适合排序
等目的类型特定的比较方法。
(2) IEnumerable 接口
IEnumerable 接口公开枚举数,该枚举数支持在集合上进行简单迭代。
IEnumerable 接口可由支持迭代内容对象的类实现。
(3) IEnumerator 接口
IEnumerator 接口支持在集合上进行简单迭代。是所有枚举数的基接口。
枚举数只允许读取集合中的数据,枚举数无法用于修改基础集合。
(4) ICollection 接口
ICollection 接口定义所有集合的大小、枚举数和同步方法。ICollection
接口是 System.Collections 命名空间中类的基接口。
(5) IDictionary 接口
IDictionary 接口是基于 ICollection 接口的更专用的接口。IDictionary 实现
是键/值对的集合,如 Hashtable 类。
(6) IList 接口
IList接口实现是可被排序且可按照索引访问其成员的值的集合,如ArrayList
类。
.NET Framework 2.0 提供了泛型的接口,如 IComparable<T> 、
IEnumerable<T> 、 IEnumerator<T> 、 ICollection<T> 、 IDictionary<T> 和
IList<T>等。泛型接口的功能与非泛型接口的功能一样,只不过适用于更多的类。
关于泛型的介绍见下一小节。
说到接口,这里要提及 1.1.2 小节讲到的 4 类数据结构中的集合。从集合的
定义中,我们知道,集合中的数据元素除了有“同属于一个集合”的关系外,没
有任何其它的关系。.NET 框架中的集合概念和数据结构中的集合概念不尽相
同。.NET 框架中集合(Collection)定义如下:
从.NET 的角度看,所谓的集合可以定义为一种对象,这种对象提供了一种
结构化组织任意对象的方式,并且实现一个或者多个 ICollection、IDictionary
和 System.Collections.IList 接口。这一定义把 System.Collections 名称空间
中的“内置”集合划分成了三种类别:
(1) 有序集合:仅仅实现 ICollection 接口的集合,在通常情况下,其数据项的
插入顺序 控制着从 集合中取 出 对象的顺 序。System.Collections.Stack 和
System.Collections.Queue 类都是 ICollection 集合的典型例子。关于 Stack
和 Queue 将在第三章详细介绍。
(2) 索引集合:实现 Ilist 的集合,其内容能经由从零开始的数字检索取出,就
象数组一样。System.Collections.ArrayList 类是索引集合的一个例子。关于
ArrayList 将在第二章详细介绍。
(3) 键式集合:实现 IDictionary 接口的集合,其中包含了能被某些类型的键值
检索的项。IDictionary 集合的内容通常按键值方式存储,可以用枚举的方式排
序检索。System.Collections.Hashtable 类实现了 IDictionary 接口。关于将
Hashtable 在第八章详细介绍。
给定集合的功能在很大程度上受到特定接口或其实现接口的控制。如果对面
向对象编程缺乏了解,那么可能对上面说的这些话感到难以理解。不过,至少应
该知道,用接口构造的对象不但具有整套类似方法的对象族,而且这些对象在必
要的情况下可以被当作同类,这就是多态性(Polymorphism)。
数据结构(C#语言版)
1.4 C#预备知识 12
同样,在.NET Framework 2.0 的 System.Collections.Generic 名称空间中
提供了泛型的集合类。泛型集合类的功能与非泛型集合类的功能一样,只不过适
用于更多的类。关于泛型的介绍见下一小节。
2、接口与抽象类
抽象类(Abstract Class)和接口在定义与功能上有很多相似的地方,在程序
中选择使用抽象类还是接口需要比较抽象类和接口之间的具体差别。
抽象类是一种不能实例化而必须从中继承的类,抽象类可以提供实现,也可
以不提供实现。子类只能从一个抽象类继承。抽象类应主要用于关系密切的对象。
如果要设计大的功能单元或创建组件的多个版本,则使用抽象类。
接口是完全抽象的成员集合,不提供实现。类或者结构可以继承多个接口。
接口最适合为不相关的类提供通用功能。如果要设计小而简练的功能块,则使用
接口。接口一旦创建就不能更改,如果需要接口的新版本,必须创建一个全新的
接口。
3、接口的实现
接口的实现分为隐式实现(Implicit Implementation) 和 显 式 实 现
(Explicit Implementaton)。如果类或者结构要实现的是单个接口,可以使用隐
式实现,如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实
现。显式实现是通过使用接口的完全限定名来实现接口成员的。
接口及该接口的 C#实现如下:
using System;
using System.Collections;
public interface IBook {
void ShowBook();
string GetTitle();
int GetPages();
void SetPages(int pages);
}
public class NewBook : IBook
{
public string title;
public int pages;
public string author;
public NewBook(string title, string author, int pages)
{
this.title = title;
this.author = author;
this.pages = pages;
}
public string GetTitle()
{
数据结构(C#语言版)
1.4 C#预备知识 13
return title;
}
public int GetPages()
{
return pages;
}
public void SetPages(int pages)
{
this.pages = pages;
}
public void ShowBook()
{
Console.WriteLine(“Title:{0}”, title);
Console.WriteLine(“Author:{0}”, author);
Console.WriteLine(“Pages:{0}”, pages);
}
}
public class App
{
static void Main()
{
NewBook MyNovel = new NewBook(“China Dream”,
“Robert”,500);
MyNovel.ShowBook();
}
}
1.4.2 泛型编程
泛型(Generic Type)是.NET Framework 2.0 最强大的功能。泛型的主要思想就
是将算法与数据结构完全分离开来,使得一次定义的算法能够作用于多种数据结
构,从而实现高度可重用的开发。通过泛型可以定义类型安全的数据结构,而没
有必要使用实际的数据类型。这将显著提高性能并得到更高质量的代码,因为可
以重用数据处理算法,而没有必要复制类型特定的代码。
1、泛型问题陈述
在开发通用容器时,需要通用容器能存储各种类型的实例。在.NET
Framework 1.1 下,必须使用基于 object 的容器。这意味着,在该容器中使用的
数据类型是难以归类的 object,并且容器方法与 object 交互。
基于 object 的容器的 C#实现如下:
public class Container
{
readonly int m_Size; //容器的容量
数据结构(C#语言版)
1.4 C#预备知识 14
int m_ContainerPointer ; //容器指针,指示最后一个元素的位置
object[] m_Items; //容器数组,存放数据
//无参构造器
public Container () : this(100)
{
m_ContainerPointer = -1;
m_Size = 100;
}
//有参构造器
public Container (int size)
{
m_Size = size;
m_Items = new object[m_Size];
m_ContainerPointer = -1;
}
//获取容器元素个数属性
public int Count
{
get
{
return m_ContainerPointer;
}
}
//容器是否为空
public bool IsEmpty
{
get
{
return (m_ContainerPointer == -1);
}
}
//容器是否已满
public bool IsFull
{
get
{
return (m_ContainerPointer == m_Size - 1);
}
}
数据结构(C#语言版)
1.4 C#预备知识 15
//在容器的尾部插入一个元素
public void Insert(object item)
{
if (IsFull)
{
Console.WriteLine("Container is full!");
return;
}
else if (IsEmpty)
{
m_Items[++m_ContainerPointer] = item;
}
else
{
m_Items[++m_ContainerPointer] = item;
}
}
//从容器的尾部删除一个元素
public object Delete()
{
if (m_ContainerPointer >= 0)
{
return m_Items[m_ContainerPointer--];
}
return null;
}
}
但是,基于 object 的容器存在以下问题。
(1) 性能问题。在使用值类型时,必须将值类型装箱(Boxing)以便推送和存
储,并且在将值类型从容器中取出时将其取消装箱(Unboxing)。装箱和取消装箱
都会根据值类型的权限造成重大的性能损失。而且,装箱和取消装箱操作还会增
加托管堆上的压力,导致更多的垃圾收集工作,这对于性能而言也不好。即使是
在使用引用类型而不是值类型时,仍然存在性能损失,因为必须强制地将 object
转换为需要的实际类型进行类型,造成强制类型转换开销,代码如下:
Container c = new Container();
c.Insert("1");
string number = (string)c.Delete();
(2) 类型安全。类型转换难以保证每次转换都是成功的,这将导致某些错误
在编译时无法被检查出来,而在运行时发生异常。因为编译器允许在任何类型和
object 之间进行强制类型转换,所以将丢失编译时类型安全。例如,以下代码可
以正确编译,但是在运行时将引发无效强制类型转换的异常。
Container c = new Container();
数据结构(C#语言版)
剩余261页未读,继续阅读
SunnyDay_1988
- 粉丝: 7
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功