C#面向對象編程進階(一) ——實現棧


    如何用C#編寫一個棧類?   

    關鍵在於這樣的一個類應該如何設計呢?首先要確立面向對象的編程思想,即類是對實體進行合理地抽象和建模,而這種思想將貫徹在我們編程的整個過程中。下面我們一步一步來做。

1.類方法簽名初步設計

    對於設計一個類而言我們應該由外而內的進行設計,首先考慮它對外部提供的接口,再去考慮其內部的安排。對於棧而言,最重要的外部特性就是壓棧和彈棧,所以要設計兩個方法Push和pop,對於壓棧而言,壓進去的元素存放在哪,所以就要用數組來開辟一段連續的存儲空間來對棧進行順序存儲。所以初步設計如下:

    public class Stack
    {
        private int[] array = new int[3];

        public void Push(int element)
        {
        }

        public int Pop()
        {
            return 0;
        }
    }  

      具體的方法應該如何實現呢?我們知道壓棧和彈棧都是在棧頂進行的,如何表示棧頂呢?我們可以設置一個計數器cout對每次壓棧操作進行計數,同樣對於彈棧操作也進行計數,使得計數器總是表示棧內元素的個數。所以在之前的代碼中添加相關語句,現在代碼如下:

    public class Stack
    {
        private int[] array = new int[3];
        private int count;

        public void Push(int element)
        {
            count++;
        }

        public int Pop()
        {
            count--;
            return 0;
        }
    }  

    接着我們來分別實現兩個方法的功能。

        public void Push(int element)
        {
            this.array[this.count] = element;
            count++;
        }

        public int Pop()
        {
            int ele = this.array[this.count - 1];
            count--;
            return ele;
        }

    至此兩個方法的功能已經基本實現。

2.設計衍化 -- 考慮到邊界情況,使用異常機制

    現在要考慮一個問題,即棧的存儲空間是用數組來固定分配的,那么壓棧就可能出現棧滿后溢出的情況。為了應對這種異常情況我們需要采取相應的措施。類似的棧也會出現棧空的情況下彈棧的情況。我們先來處理后者:

        public int Pop()
        {
            if (this.count == 0)
            {
                throw new Exception("堆棧已經為空!");
            }

            int ele = this.array[this.count - 1];
            --this.count;
            return ele;
        }

    然后我們在測試方法中添加try-catch語句便能夠對拋出的異常進行處理。

    而對於push方法,我們希望在棧滿的情況下追加存儲空間應該如何做呢?

    我們再定義一個數組,開辟出兩倍於原數組的連續存儲空間,然后將原數組中的元素拷貝給新數組,再將新數組的引用賦值給原數組以便於外部使用。

        public void Push(int element)
        {
            if (this.count == this.array.Length)
            {
                int[] array2 = new int[this.array.Length * 2];
                for (int i = 0; i < this.array.Length; i++)
                {
                    array2[i] = array[i];
                }
                this.array = array2;
            }
                this.array[this.count] = element;
                this.count++;


        }

    這樣一來,這個類就已經基本設計好了。

3.功能測試

    在main方法中添加如下測試代碼:

        static void Main(string[] args)
        {
            try
            {
                Stack stack = new Stack();
                stack.Push(2);
                stack.Push(5);
                stack.Push(8);
                stack.Push(9);
                int ele1 = stack.Pop();
                Console.WriteLine("{0}", ele1);
                int ele2 = stack.Pop();
                Console.WriteLine("{0}", ele2);
                int ele3 = stack.Pop();
                Console.WriteLine("{0}", ele3);
                int ele4 = stack.Pop();
                Console.WriteLine("{0}", ele4);
            }
            catch (Exception exception)
            {
                Console.WriteLine("執行發生錯誤!" + exception.Message);
            }
            Console.Read();
        }

    運行結果如下:

      

 


免責聲明!

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



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