堆、栈以及队列
程序员文章站
2022-12-25 16:51:57
这个也是比较容易翻车的东西,记录一下 补充点内容差点忘了:C#里面 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。 堆 1,有人老是搞不明白堆 ......
这个也是比较容易翻车的东西,记录一下
补充点内容差点忘了: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; } } } }