堆、栈以及队列
这个也是比较容易翻车的东西,记录一下
补充点内容差点忘了:C#里面
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
堆
1,有人老是搞不明白堆和栈的叫法。我来解释下:
堆:在c里面叫堆,在c#里面其实叫托管堆。为什么叫托管堆,我们往下看。
栈:就是堆栈,因为和堆一起叫着别扭,就简称栈了。
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; } } } }