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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM