C#实现自定义栈

使用C#自定义栈

1.定义一个MyStack泛型类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _06_MyStack
{
    class MyStack<T> : IEnumerable<T>, IDisposable
    {
        //栈顶指针
        private int _top = 0;
        //栈的大小
        private int _size = 0;
        //栈的数据
        private T[] _stack = null;

        public int Top
        {
            get { return _top; }
        }

        public int Size
        {
            get { return _size; }
        }

        public int Length
        {
            get { return _top; }
        }

        public T this[int index]
        {
            get { return _stack[index]; }
        }

        /// <summary>
        /// 栈的构造函数
        /// </summary>
        /// <param name="size">初始化栈的大小</param>
        public MyStack(int size)
        {
            _size = size;
            _top = 0;
            _stack = new T[size];
        }
        
        /// <summary>
        /// 栈是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsEmpty()
        {
            return _top == 0;
        }

        /// <summary>
        /// 栈是否已满
        /// </summary>
        /// <returns></returns>
        public bool IsFull()
        {
            return _top == _size;
        }

        /// <summary>
        /// 清除栈
        /// </summary>
        public void Clear()
        {
            _top = 0;
        }

        /// <summary>
        /// 入栈
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public bool Push(T node)
        {
            if(!IsFull())
            {
                _stack[_top] = node;
                _top++;
                return true;
            }
            return false;
        }

        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            //此default关键字对于引用类型会返回空,对于数值类型会返回零
            T node = default(T);
            if (!IsEmpty())
            {
                _top--;
                node = _stack[_top];
            }
            return node;
        }



        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            _stack = null;
        }

        /// <summary>
        /// 迭代器,用于foreach迭代
        /// </summary>
        /// <returns></returns>
        public IEnumerator<T> GetEnumerator()
        {
            for(int i=0;i<_stack.Length;i++)
            {
                if(_stack[i] != null)
                {
                    yield return _stack[i];
                }
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}

2.测试

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// 06_MyStack
/// 自定义实现栈
/// 栈特点:先进后出
/// </summary>
namespace _06_MyStack
{
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person
            {
                Name = "Flyee",
                Age = 24
            };
            Person p2 = new Person
            {
                Name = "Flyee2",
                Age = 18
            };
            Stack<Person> stack = new Stack<Person>(2);

            MyStack<Person> myStack = new MyStack<Person>(2);
            myStack.Push(p1);
            myStack.Push(p2);

            foreach(var p in myStack)
            {
                Console.WriteLine(p.Name);
            }

            Console.WriteLine(myStack[1].Age);

            Person result = myStack.Pop();
            Console.WriteLine(myStack.Length);
            Console.WriteLine("Name:" + result.Name + " Age:" + result.Age);
            myStack.Pop();
            Console.WriteLine(myStack.Length);
            myStack.Dispose();

            Console.Read();
        }
    }
}

3.测试结果

参考博客地址:https://www.cnblogs.com/yezhu008/p/5726234.html

 

posted @ 2018-03-22 13:12  AbstractLee  阅读(1303)  评论(0编辑  收藏  举报