堆、栈以及队列

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

补充点内容差点忘了: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;
            }
        }

    }
}

 

posted @ 2018-10-09 14:46 饮雪俊枫 阅读(...) 评论(...) 编辑 收藏