这个也是比较容易翻车的东西,记录一下c#
补充点内容差点忘了:C#里面数据结构
栈是编译期间就分配好的内存空间,所以你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。函数
堆是程序运行期间动态分配的内存空间,你能够根据程序的运行状况肯定要分配的堆内存的大小。spa
堆.net
1,有人总是搞不明白堆和栈的叫法。我来解释下:code
堆:在c里面叫堆,在c#里面其实叫托管堆。为何叫托管堆,咱们往下看。对象
栈:就是堆栈,由于和堆一块儿叫着别扭,就简称栈了。blog
2,托管堆:队列
托管堆不一样于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了以后,会自动清理堆中的垃圾。因此,作为.net开发,咱们不须要关心内存释放的问题。内存
3,什么是内存堆栈与数据结构堆栈,咱们来看看什么是内存堆栈,什么是数据结构堆栈
①数据结构堆栈:是一种后进先出的数据结构,它是一个概念,图4-1中能够看出,栈是一种后进先出的数据结构。
②内存堆栈:存在内存中的两个存储区(堆区,栈区)。
栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放
堆区:存放着引用类型的对象,由CLR释放
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫作栈的顶(TOP),对栈的基本操做有进栈(Push)和出栈(POP),俗称后进先出
因为栈是一个表,所以任何实现表的方式都能实现栈
栈用C#实现的方式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnilateralismChainTable; namespace StackApply { public class CStack { //调用链表类 private Clist m_List; public CStack() { //构造函数 m_List = new Clist(); } /// <summary> /// 压入堆栈 /// </summary> public void Push(int PushValue) { //参数: int PushValue 压入堆栈的数据 m_List.Append(PushValue); } /// <summary> /// 弹出堆栈数据,若是为空,则取得 2147483647 为 int 的最大值; /// </summary> public int Pop() { //功能:弹出堆栈数据 int PopValue; if (!IsNullStack()) { //不为空堆栈 //移动到顶 MoveTop(); //取得弹出的数据 PopValue = GetCurrentValue(); //删除 Delete(); return PopValue; } // 空的时候为 int 类型的最大值 return 2147483647; } /// <summary> /// 判断是否为空的堆栈 /// </summary> public bool IsNullStack() { if (m_List.IsNull()) return true; return false; } /// <summary> /// 堆栈的个数 /// </summary> public int StackListCount { get { return m_List.ListCount; } } /// <summary> /// 移动到堆栈的底部 /// </summary> public void MoveBottom() { m_List.MoveFrist(); } /// <summary> /// 移动到堆栈的Top /// </summary> public void MoveTop() { m_List.MoveLast(); } /// <summary> /// 向上移动 /// </summary> public void MoveUp() { m_List.MoveNext(); } /// <summary> /// 向上移动 /// </summary> public void MoveDown() { m_List.MovePrevious(); } /// <summary> /// 取得当前的值 /// </summary> public int GetCurrentValue() { return m_List.GetCurrentValue(); } /// <summary> /// 删除取得当前的结点 /// </summary> public void Delete() { m_List.Delete(); } /// <summary> /// 清空堆栈 /// </summary> public void Clear() { m_List.Clear(); } } }
队列也是表,然而使用队列时插入在一端进行而删除在另外一端进行,这一点跟栈不同的地方就是队列是先进先出的
对于队列的基本操做有入队和出队
队列用C#实现的方式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnilateralismChainTable; namespace Alignment { /// <summary> /// 队列类 /// </summary> public class CQueue { private Clist m_List; public CQueue() { //构造函数 //这里使用到前面编写的List m_List = new Clist(); } /// <summary> /// 入队 /// </summary> public void EnQueue(int DataValue) { //功能:加入队列,这里使用List 类的Append 方法: //尾部添加数据,数据个数加1 m_List.Append(DataValue); } /// <summary> /// 出队 /// </summary> public int DeQueue() { //功 能:出队 //返回值: 2147483647 表示为空队列无返回 int QueValue; if (!IsNull()) { //不为空的队列 //移动到队列的头 m_List.MoveFrist(); //取得当前的值 QueValue = m_List.GetCurrentValue(); //删除出队的数据 m_List.Delete(); return QueValue; } return 2147483647; } /// <summary> /// 判断队列是否为空 /// </summary> public bool IsNull() { //功能:判断是否为空的队列 return m_List.IsNull(); } /// <summary> /// 清空队列 /// </summary> public void Clear() { //清空链表 m_List.Clear(); } /// <summary> /// 取得队列的数据个数 /// </summary> public int QueueCount { get { //取得队列的个数 return m_List.ListCount; } } } }