欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

堆、栈以及队列

程序员文章站 2022-05-25 12:20:05
这个也是比较容易翻车的东西,记录一下 补充点内容差点忘了: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;
            }
        }

    }
}