C#数据结构学习笔记——栈

1. 栈

先进后出是栈。只能一端进行添加(入栈)或删除(出栈)操作,这一端叫栈顶。应用例如:数组反转、递归。栈的具体操作(Stack):

  1. 往栈中插入元素:void Push(e):

  2. 取出栈顶元素并删除:E Pop()

  3. 查看栈顶元素:E Peek()

  4. 栈中数组元素数量:int Count { get; }

  5. 栈是否空:bool IsEmpty { get; }

设计栈接口来实现

interface IStack<E>
    {
   
        int Count {
    get; }//栈中数组元素数量
        bool IsEmpty {
    get; }//栈是否空
        void Push(E e);//往栈插入元素
        E Pop();//删除栈顶元素
        E Peek();//查询栈顶元素
    }

1.1 数组栈

数组栈类Array1Stack,基于Array1动态数组,实现栈接口

namespace StackLearn
{
   
    /// <summary>
    /// //动态数组框架
    /// </summary>
    class Array1<T>
    {
   
        private T[] data;//存储元素的静态数组data
        private int N;//存储元素个数N

        public Array1(int capacity)//有参构造
        {
   
            data = new T[capacity];
            N = 0;
        }

        public Array1() : this(10) {
    }//无参构造
        //public Array1()
        //{
   
        //    data = new int[10];
        //    N = 0;
        //}

        private void ResetCapacity(int newCapacity)
        {
   
            T[] newData = new T[newCapacity];
            for (int i = 0; i < N; i++)
                newData[i] = data[i];

            data = newData;
        }

        public int Capacity//获取数组容量
        {
   
            get {
    return data.Length; }
        }

        public int Count//获取数组元素个数
        {
   
            get {
    return N; }
        }

        public bool IsEmpty//判断数组是否为空
        {
   
            get {
    return N == 0; }
        }

        public void Add(int index, T e)//添加元素到数组中的指定索引位置
        {
   
            if (index < 0 || index > N)//判断索引位置是否合法
                throw new ArgumentException("数组索引越界");

            if (N == data.Length)//判断数组容量是否满了
                ResetCapacity(2 * data.Length);

            for (int i = N - 1; i >= index; i--)//从数组末尾向后移动元素
                data[i + 1] = data[i];

            data[index] = e;
            N++;
        }

        public void AddLast(T e)//数组末尾添加元素
        {
   
            Add(N, e);
        }

        public void AddFirst(T e)//数组头部添加元素
        {
   
            Add(0, e);
        }

        public T Get(int index)//获取指定索引位置元素
        {
   
            if (index < 0 || index >= N)
                throw new ArgumentException("数组索引越界");

            return data[index];
        }

        public T GetFirst()//获取首个元素
        {
   
            return Get(0);
        }

        public T GetLast()//获取末尾元素
        {
   
            return Get(N - 1);
        }

        public void Set(int index, T newE)//修改指定索引的元素
        {
   
            if (index < 0 || index >= N)
                throw new ArgumentException("数组索引越界");

            data[index] = newE;
        }

        public bool Contains(T e)//是否包含元素
        {
   
            for (int i = 0
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值