zoukankan      html  css  js  c++  java
  • 堆、栈以及队列

    这个也是比较容易翻车的东西,记录一下

    补充点内容差点忘了: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;
                }
            }
    
        }
    }
  • 相关阅读:
    独立性检验|适应性检验|卡方检验|离散型数据|连续型数据
    双因子方差分析|adjusted R|强度|SSA|SSE|SST|
    发明人|申请人|专利权人|完全民事能力|谁主张谁证明|新颖性|创造性|实用性|先申请制
    方差分析|重复|指标|因素|处理效应|实验误差|实验设计可避免的误差|一般线性|广义线性
    字符数组1
    四舍五入输出数字
    如何输出0001, 0002, 0003... 这样的数
    shell scripting Python
    [C&Python]9x9乘法口诀打印
    [pointer]调用函数找出一维数组中的最值,
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/9760238.html
Copyright © 2011-2022 走看看