C#学习笔记——(24).Net与数据结构
数据与数据结构
数据结构包括三方面
- 数据的逻辑结构
- 数据的存储结构
- 数据的运算(即数据的处理操作)
数据的存储结构 - 顺序存储结构
- 链式存储结构—将存放每个数据元素的结点分为两部分,一部分存放数据元素(数据域),另一部分存放指示存储地址的指针(指针域)
- 索引存储结构
- 散列存储结构
线性表
线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点(第一个结点)没有前驱但有一个后继结点,有且仅有一个终端结点(最后一个结点)没有后继但有一个前驱结点,其他的结点都有且仅有一个前驱和一个后继结点。
线性表常用操作
- 置空表
- 求表长
- 取表中元素
- 取元素ki的直接前驱/直接后继
- 定位
- 插入
- 删除
线性表存储结构
- 顺序存储
- 链式存储
在Visual C#中,还可以通过.NET提供的List类来实现。按照使用类的方法,应该先声明一个List类的对象,这样就有了一个线性表对象。需要注意的是List类是一个泛型类,关于泛型是一个较复杂的概念。在此,简单的理解为创建一个List对象时需要指明将在List中存储何种类型的数据。如声明一个整数类型的List对象的格式:List< int > list=new List< int >(1000); 后面的1000指线性表长度,默认20。
List类常用方法
- Add:将对象添加到List的结尾处
- Clear:从 List中移除所有元素(置空表)
- Contains:确定某元素是否在List中。如在,Contains返回True,否则返回False
- FindIndex:搜索与指定条件相匹配的元素,返回 List或它的一部分中第一个匹配项的从零开始的索引
- IndexOf:返回List或它的一部分中某个值的第一个匹配项的从零开始的索引
- Insert:将元素插入List的指定索引处
- LastIndexOf:返回 List或它的一部分中某个值的最后一个匹配项的从零开始的索引
- Remove:从List中移除特定对象的第一个匹配项
- RemoveAt:移除List的指定索引处的元素
- Reverse:将 List或它的一部分中元素的顺序反转
- Sort:对List或它的一部分中的元素进行排序
栈和队列
栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制。
栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表。
栈
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈(POP)。栈也称为先进后出表。
栈的常见操作
- 求栈的长度:GetLength,返回栈中数据元素的个数
- 判断栈是否为空:IsEmpty,如果栈为空返回true,否则返回false
- 清空栈:Clear,使栈为空
- 入栈操作:Push将新的数据元素添加到栈顶,栈发生变化
- 出栈操作:Pop将顶元素从中取出,栈发生变化
- 取栈顶元素:GetTop返回栈顶元素的值,栈不发生变化
Stack类主要方法
- Clear:从Stack中移除所有对象
- Contains:确定某元素是否在 Stack 中
- Peek:返回位于 Stack 顶部的对象但不将其移除
- Pop:移除并返回位于 Stack 顶部的对象
- Push:将对象插入 Stack 的顶部
队列
队列可以用数组来存储,数组的上界即是队列所容许的最大容量。在队列的运算中需设两个索引下标:front,队头存放实际队头元素的前一个位置;rear,队尾
存放实际队尾元素所在的位置。一般情况下,两个索引的初值设为0,这时队列为空,没有元素。
队列常见操作
- 求队列的长度GetLength,得到队列中数据元素的个数
- 判断队列是否为空IsEmpty,如果队列为空返回true,否则返回false
- 清空队列Clear,使队列为空
- 入队EnQueue,将新数据元素添加到队尾,队列发生变化
- 出队DlQueue,将队头元素从队列中取出,队列发生变化
- 取队头元素GetFront,返回队头元素的值,队列不发生变化
Queue类和Stack类相似,也提供了Queue类。该类实现了队列的常用算法,并且当队列容量不足时会自动增加队列的大小。
Queue类主要方法
- Clear:从Queue中移除所有对象
- Contains:确定某元素是否在Queue中
- CopyTo:从指定数组索引开始将Queue元素复制到现有一维Array中
- Dequeue:移除并返回位于Queue开始处的对象
- ToArray:将Queue元素复制到新数组
- Enqueue:将对象添加到Queue的结尾处
- Peek:返回位于Queue开始处的对象但不将其移除
例题-链表/栈/队列
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
//使用线性表要声明list类,链表大小为20.链表是数组的很好的取代
List<int> listInt = new List<int>(20);
listInt.Add(34); //加入数据,移除move
var count = listInt.Count;
//链表
LinkedList<string> listLink = new LinkedList<string>();
//链表仅有上面的链不行,需要辅助的类加入链表
LinkedListNode<string> node = new LinkedListNode<string>("zhangsan");
//加入第一个结点
listLink.AddFirst(node1);
LinkedListNode<string> node2 = new LinkedListNode<string>("LiSi");
//将结点2加入结点1后面
listLink.AddAfter(node1, node2);
Stack<int> sk = new Stack<int>();
sk.Push(78); //压栈
var k = sk.Pop(); //弹栈
Queue<char> qchar = new Queue<char>();
qchar.Enqueue('Y'); //进队
var m = qchar.Dequeue(); //出队
}
}
}