没有合适的资源?快使用搜索试试~ 我知道了~
首页C#数据结构与算法分析:面向.NET的专业教材
C#数据结构与算法分析:面向.NET的专业教材
需积分: 9 2 下载量 169 浏览量
更新于2024-07-30
收藏 2.45MB PDF 举报
"《最佳学习教材-C#-数据结构-算法分析》是一本专为C#编程爱好者和教育工作者打造的数据结构教程。作者在编写本书时面临着双重挑战:一是市场上已有多语言数据结构教材,但用C#语言讲解的却寥寥无几,因为C#作为.NET平台的主要开发语言,其简洁高效和面向对象的特点使其在教育领域受到关注。二是C#语言和.NET Framework的发展速度较快,作者最初基于2.0版本编写,但最终版本已更新至3.0,这体现了技术进步的迅速。 本书共八章,首章概述了数据结构和算法的基础概念,以及必要的数学和C#基础知识。接下来的五章详细解析了线性表、栈与队列、字符串和数组、树形结构和图结构等常见数据结构,同时展示了如何在.NET Framework中实现这些结构。最后两章则深入探讨排序和查找的多种方法及其应用,以及相关的.NET平台中的算法。 本书的最大特色在于将数据结构理论与实际的C#语言实践相结合,利用.NET平台的统一性和C#语言的优势,让读者能够在学习数据结构的同时,熟悉并掌握面向对象的C#编程和.NET框架的运用。尽管书中技术并非最新,但作为2.0版本的教材,它为学习者提供了一个坚实的基础,并展现出C#在数据结构教学中的实用性。对于想要深入理解数据结构并应用于C#开发的人来说,这是一本不可多得的参考资料。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/3562919/bg10.jpg)
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#语言版)
![](https://csdnimg.cn/release/download_crawler_static/3562919/bg11.jpg)
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#语言版)
![](https://csdnimg.cn/release/download_crawler_static/3562919/bg12.jpg)
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#语言版)
![](https://csdnimg.cn/release/download_crawler_static/3562919/bg13.jpg)
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#语言版)
![](https://csdnimg.cn/release/download_crawler_static/3562919/bg14.jpg)
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页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/bb409940051043c388ff9efd7a2efcc9_cd_xyg.jpg!1)
vivicai520
- 粉丝: 0
- 资源: 24
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 构建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 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)